Skip to content

Commit 26880b8

Browse files
rain84yanglbme
andauthored
feat: add solutions to lc problem: No.1550 (#3184)
Co-authored-by: Libin YANG <contact@yanglibin.info>
1 parent 805d2fc commit 26880b8

File tree

12 files changed

+268
-99
lines changed

12 files changed

+268
-99
lines changed

solution/1500-1599/1550.Three Consecutive Odds/README.md

Lines changed: 99 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,15 @@ tags:
5151

5252
<!-- solution:start -->
5353

54-
### 方法一:遍历数组
54+
### 方法一:遍历 + 计数
5555

56-
直接遍历数组,统计连续奇数的个数,如果个数达到 3,则返回 `true`,否则遍历结束,返回 `false`
56+
我们用一个变量 $\text{cnt}$ 记录当前连续奇数的个数
5757

58-
时间复杂度 $O(n)$,空间复杂度 $O(1)$,其中 $n$ 为数组 `arr` 的长度。
58+
接下来,我们遍历数组,如果当前元素是奇数,则 $\text{cnt}$ 加一,如果 $\text{cnt}$ 等于 3,则返回 $\text{True}$。如果当前元素是偶数,则 $\text{cnt}$ 置零。
59+
60+
遍历结束后,如果没有找到连续三个奇数,则返回 $\text{False}$。
61+
62+
时间复杂度 $O(n)$,其中 $n$ 是数组 $\text{arr}$ 的长度。空间复杂度 $O(1)$。
5963

6064
<!-- tabs:start -->
6165

@@ -65,13 +69,13 @@ tags:
6569
class Solution:
6670
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
6771
cnt = 0
68-
for v in arr:
69-
if v & 1:
72+
for x in arr:
73+
if x & 1:
7074
cnt += 1
75+
if cnt == 3:
76+
return True
7177
else:
7278
cnt = 0
73-
if cnt == 3:
74-
return True
7579
return False
7680
```
7781

@@ -81,15 +85,14 @@ class Solution:
8185
class Solution {
8286
public boolean threeConsecutiveOdds(int[] arr) {
8387
int cnt = 0;
84-
for (int v : arr) {
85-
if (v % 2 == 1) {
86-
++cnt;
88+
for (int x : arr) {
89+
if (x % 2 == 1) {
90+
if (++cnt == 3) {
91+
return true;
92+
}
8793
} else {
8894
cnt = 0;
8995
}
90-
if (cnt == 3) {
91-
return true;
92-
}
9396
}
9497
return false;
9598
}
@@ -103,12 +106,14 @@ class Solution {
103106
public:
104107
bool threeConsecutiveOdds(vector<int>& arr) {
105108
int cnt = 0;
106-
for (int v : arr) {
107-
if (v & 1)
108-
++cnt;
109-
else
109+
for (int x : arr) {
110+
if (x & 1) {
111+
if (++cnt == 3) {
112+
return true;
113+
}
114+
} else {
110115
cnt = 0;
111-
if (cnt == 3) return true;
116+
}
112117
}
113118
return false;
114119
}
@@ -120,15 +125,15 @@ public:
120125
```go
121126
func threeConsecutiveOdds(arr []int) bool {
122127
cnt := 0
123-
for _, v := range arr {
124-
if v%2 == 1 {
128+
for _, x := range arr {
129+
if x&1 == 1 {
125130
cnt++
131+
if cnt == 3 {
132+
return true
133+
}
126134
} else {
127135
cnt = 0
128136
}
129-
if cnt == 3 {
130-
return true
131-
}
132137
}
133138
return false
134139
}
@@ -139,15 +144,14 @@ func threeConsecutiveOdds(arr []int) bool {
139144
```ts
140145
function threeConsecutiveOdds(arr: number[]): boolean {
141146
let cnt = 0;
142-
for (const v of arr) {
143-
if (v & 1) {
144-
++cnt;
147+
for (const x of arr) {
148+
if (x & 1) {
149+
if (++cnt == 3) {
150+
return true;
151+
}
145152
} else {
146153
cnt = 0;
147154
}
148-
if (cnt == 3) {
149-
return true;
150-
}
151155
}
152156
return false;
153157
}
@@ -159,7 +163,13 @@ function threeConsecutiveOdds(arr: number[]): boolean {
159163

160164
<!-- solution:start -->
161165

162-
### 方法二
166+
### 方法二:遍历 + 位运算
167+
168+
根据位运算的性质,两个数进行按位与运算是奇数,当且仅当两个数都是奇数。如果有连续三个数按位与运算的结果是奇数,那么这三个数都是奇数。
169+
170+
因此,我们只需要遍历数组,判断是否存在连续三个数的按位与结果是否是奇数即可,如果存在则返回 $\text{True}$,否则返回 $\text{False}$。
171+
172+
时间复杂度 $O(n)$,其中 $n$ 是数组 $\text{arr}$ 的长度。空间复杂度 $O(1)$。
163173

164174
<!-- tabs:start -->
165175

@@ -168,10 +178,65 @@ function threeConsecutiveOdds(arr: number[]): boolean {
168178
```python
169179
class Solution:
170180
def threeConsecutiveOdds(self, arr: List[int]) -> bool:
171-
for i in range(len(arr) - 2):
172-
if arr[i] % 2 + arr[i + 1] % 2 + arr[i + 2] % 2 == 3:
173-
return True
174-
return False
181+
return any(x & arr[i + 1] & arr[i + 2] & 1 for i, x in enumerate(arr[:-2]))
182+
```
183+
184+
#### Java
185+
186+
```java
187+
class Solution {
188+
public boolean threeConsecutiveOdds(int[] arr) {
189+
for (int i = 2, n = arr.length; i < n; ++i) {
190+
if ((arr[i - 2] & arr[i - 1] & arr[i] & 1) == 1) {
191+
return true;
192+
}
193+
}
194+
return false;
195+
}
196+
}
197+
```
198+
199+
#### C++
200+
201+
```cpp
202+
class Solution {
203+
public:
204+
bool threeConsecutiveOdds(vector<int>& arr) {
205+
for (int i = 2, n = arr.size(); i < n; ++i) {
206+
if (arr[i - 2] & arr[i - 1] & arr[i] & 1) {
207+
return true;
208+
}
209+
}
210+
return false;
211+
}
212+
};
213+
```
214+
215+
#### Go
216+
217+
```go
218+
func threeConsecutiveOdds(arr []int) bool {
219+
for i, n := 2, len(arr); i < n; i++ {
220+
if arr[i-2]&arr[i-1]&arr[i]&1 == 1 {
221+
return true
222+
}
223+
}
224+
return false
225+
}
226+
```
227+
228+
#### TypeScript
229+
230+
```ts
231+
function threeConsecutiveOdds(arr: number[]): boolean {
232+
const n = arr.length;
233+
for (let i = 2; i < n; ++i) {
234+
if (arr[i - 2] & arr[i - 1] & arr[i] & 1) {
235+
return true;
236+
}
237+
}
238+
return false;
239+
}
175240
```
176241

177242
<!-- tabs:end -->

0 commit comments

Comments
 (0)