Skip to content

Commit 1da0998

Browse files
authored
feat: add solutions to lc problem: No.1006 (doocs#3069)
No.1006.Clumsy Factorial
1 parent ea51bd3 commit 1da0998

File tree

13 files changed

+364
-114
lines changed

13 files changed

+364
-114
lines changed

lcof2/剑指 Offer II 037. 小行星碰撞/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ impl Solution {
227227
class Solution {
228228
func asteroidCollision(_ asteroids: [Int]) -> [Int] {
229229
var stack = [Int]()
230-
230+
231231
for asteroid in asteroids {
232232
if asteroid > 0 {
233233
stack.append(asteroid)
@@ -242,7 +242,7 @@ class Solution {
242242
}
243243
}
244244
}
245-
245+
246246
return stack
247247
}
248248
}

lcof2/剑指 Offer II 038. 每日温度/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,15 @@ class Solution {
188188
let n = temperatures.count
189189
var ans = [Int](repeating: 0, count: n)
190190
var stack = [Int]()
191-
191+
192192
for i in 0..<n {
193193
while !stack.isEmpty && temperatures[stack.last!] < temperatures[i] {
194194
let j = stack.removeLast()
195195
ans[j] = i - j
196196
}
197197
stack.append(i)
198198
}
199-
199+
200200
return ans
201201
}
202202
}

lcof2/剑指 Offer II 041. 滑动窗口的平均值/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,13 @@ class MovingAverage {
179179
private var arr: [Int]
180180
private var s: Int
181181
private var cnt: Int
182-
182+
183183
init(_ size: Int) {
184184
arr = [Int](repeating: 0, count: size)
185185
s = 0
186186
cnt = 0
187187
}
188-
188+
189189
func next(_ val: Int) -> Double {
190190
let idx = cnt % arr.count
191191
s += val - arr[idx]

lcof2/剑指 Offer II 042. 最近请求次数/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,11 +218,11 @@ RecentCounter.prototype.ping = function (t) {
218218
```swift
219219
class RecentCounter {
220220
private var q: [Int]
221-
221+
222222
init() {
223223
q = []
224224
}
225-
225+
226226
func ping(_ t: Int) -> Int {
227227
q.append(t)
228228
while q.first! < t - 3000 {

solution/1000-1099/1006.Clumsy Factorial/README.md

Lines changed: 123 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -61,56 +61,148 @@ tags:
6161

6262
<!-- solution:start -->
6363

64-
### 方法一
64+
### 方法一:栈 + 模拟
65+
66+
笨阶乘的计算过程可以看作是一个栈的模拟过程。
67+
68+
我们定义一个栈 `stk`,初始时我们将 $n$ 入栈,定义一个变量 $k$,表示当前的操作符,初始时 $k = 0$。
69+
70+
然后我们从 $n-1$ 开始,枚举 $x$,根据当前的 $k$ 的值,决定如何处理 $x$:
71+
72+
- 当 $k = 0$ 时,表示乘法操作,我们将栈顶元素出栈,与 $x$ 相乘后再入栈;
73+
- 当 $k = 1$ 时,表示除法操作,我们将栈顶元素出栈,与 $x$ 相除后取整数部分再入栈;
74+
- 当 $k = 2$ 时,表示加法操作,我们直接将 $x$ 入栈;
75+
- 当 $k = 3$ 时,表示减法操作,我们将 $-x$ 入栈。
76+
77+
接着我们更新 $k = (k + 1) \mod 4$。
78+
79+
最后,我们将栈中的元素累加即为答案。
80+
81+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为题目给定的整数 $N$。
6582

6683
<!-- tabs:start -->
6784

6885
#### Python3
6986

7087
```python
7188
class Solution:
72-
def clumsy(self, N: int) -> int:
73-
op = 0
74-
s = [N]
75-
for i in range(N - 1, 0, -1):
76-
if op == 0:
77-
s.append(s.pop() * i)
78-
elif op == 1:
79-
s.append(int(s.pop() / i))
80-
elif op == 2:
81-
s.append(i)
89+
def clumsy(self, n: int) -> int:
90+
k = 0
91+
stk = [n]
92+
for x in range(n - 1, 0, -1):
93+
if k == 0:
94+
stk.append(stk.pop() * x)
95+
elif k == 1:
96+
stk.append(int(stk.pop() / x))
97+
elif k == 2:
98+
stk.append(x)
8299
else:
83-
s.append(-i)
84-
op = (op + 1) % 4
85-
return sum(s)
100+
stk.append(-x)
101+
k = (k + 1) % 4
102+
return sum(stk)
86103
```
87104

88105
#### Java
89106

90107
```java
91108
class Solution {
92-
public int clumsy(int N) {
93-
Deque<Integer> s = new ArrayDeque<>();
94-
s.offerLast(N);
95-
int op = 0;
96-
for (int i = N - 1; i > 0; --i) {
97-
if (op == 0) {
98-
s.offerLast(s.pollLast() * i);
99-
} else if (op == 1) {
100-
s.offerLast(s.pollLast() / i);
101-
} else if (op == 2) {
102-
s.offerLast(i);
109+
public int clumsy(int n) {
110+
Deque<Integer> stk = new ArrayDeque<>();
111+
stk.push(n);
112+
int k = 0;
113+
for (int x = n - 1; x > 0; --x) {
114+
if (k == 0) {
115+
stk.push(stk.pop() * x);
116+
} else if (k == 1) {
117+
stk.push(stk.pop() / x);
118+
} else if (k == 2) {
119+
stk.push(x);
103120
} else {
104-
s.offerLast(-i);
121+
stk.push(-x);
105122
}
106-
op = (op + 1) % 4;
123+
k = (k + 1) % 4;
107124
}
108-
int res = 0;
109-
while (!s.isEmpty()) {
110-
res += s.pollLast();
125+
return stk.stream().mapToInt(Integer::intValue).sum();
126+
}
127+
}
128+
```
129+
130+
#### C++
131+
132+
```cpp
133+
class Solution {
134+
public:
135+
int clumsy(int n) {
136+
stack<int> stk;
137+
stk.push(n);
138+
int k = 0;
139+
for (int x = n - 1; x; --x) {
140+
if (k == 0) {
141+
stk.top() *= x;
142+
} else if (k == 1) {
143+
stk.top() /= x;
144+
} else if (k == 2) {
145+
stk.push(x);
146+
} else {
147+
stk.push(-x);
148+
}
149+
k = (k + 1) % 4;
150+
}
151+
int ans = 0;
152+
while (!stk.empty()) {
153+
ans += stk.top();
154+
stk.pop();
155+
}
156+
return ans;
157+
}
158+
};
159+
```
160+
161+
#### Go
162+
163+
```go
164+
func clumsy(n int) (ans int) {
165+
stk := []int{n}
166+
k := 0
167+
for x := n - 1; x > 0; x-- {
168+
switch k {
169+
case 0:
170+
stk[len(stk)-1] *= x
171+
case 1:
172+
stk[len(stk)-1] /= x
173+
case 2:
174+
stk = append(stk, x)
175+
case 3:
176+
stk = append(stk, -x)
177+
}
178+
k = (k + 1) % 4
179+
}
180+
for _, x := range stk {
181+
ans += x
182+
}
183+
return
184+
}
185+
```
186+
187+
#### TypeScript
188+
189+
```ts
190+
function clumsy(n: number): number {
191+
const stk: number[] = [n];
192+
let k = 0;
193+
for (let x = n - 1; x; --x) {
194+
if (k === 0) {
195+
stk.push(stk.pop()! * x);
196+
} else if (k === 1) {
197+
stk.push((stk.pop()! / x) | 0);
198+
} else if (k === 2) {
199+
stk.push(x);
200+
} else {
201+
stk.push(-x);
111202
}
112-
return res;
203+
k = (k + 1) % 4;
113204
}
205+
return stk.reduce((acc, cur) => acc + cur, 0);
114206
}
115207
```
116208

0 commit comments

Comments
 (0)