Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 07a0022

Browse files
authored
feat: add solutions to lc problems: No.1903~1905 (doocs#2102)
* No.1903.Largest Odd Number in String * No.1904.The Number of Full Rounds You Have Played * No.1905.Count Sub Islands
1 parent 5ad2c28 commit 07a0022

File tree

18 files changed

+546
-952
lines changed

18 files changed

+546
-952
lines changed

solution/1900-1999/1903.Largest Odd Number in String/README.md

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@
4949

5050
<!-- 这里可写通用的实现逻辑 -->
5151

52-
从后往前遍历字符串中的每个数字,遇到奇数则直接返回结果。若遍历结束仍未遇到奇数,返回空字符串。
52+
**方法一:逆序遍历**
53+
54+
我们可以从后往前遍历字符串,找到第一个奇数,然后返回从开头到该奇数的子字符串即可。如果不存在奇数,则返回空字符串。
55+
56+
时间复杂度 $O(n)$,其中 $n$ 是字符串 $num$ 的长度。忽略答案字符串的空间消耗,空间复杂度 $O(1)$。
5357

5458
<!-- tabs:start -->
5559

@@ -84,24 +88,6 @@ class Solution {
8488
}
8589
```
8690

87-
### **JavaScript**
88-
89-
```js
90-
/**
91-
* @param {string} num
92-
* @return {string}
93-
*/
94-
var largestOddNumber = function (num) {
95-
let n = num.length;
96-
for (let j = n - 1; j >= 0; j--) {
97-
if (num.charAt(j) & (1 == 1)) {
98-
return num.slice(0, j + 1);
99-
}
100-
}
101-
return '';
102-
};
103-
```
104-
10591
### **C++**
10692

10793
```cpp
@@ -133,6 +119,36 @@ func largestOddNumber(num string) string {
133119
}
134120
```
135121

122+
### **TypeScript**
123+
124+
```ts
125+
function largestOddNumber(num: string): string {
126+
for (let i = num.length - 1; ~i; --i) {
127+
if (Number(num[i]) & 1) {
128+
return num.slice(0, i + 1);
129+
}
130+
}
131+
return '';
132+
}
133+
```
134+
135+
### **JavaScript**
136+
137+
```js
138+
/**
139+
* @param {string} num
140+
* @return {string}
141+
*/
142+
var largestOddNumber = function (num) {
143+
for (let i = num.length - 1; ~i; --i) {
144+
if (Number(num[i]) & 1) {
145+
return num.slice(0, i + 1);
146+
}
147+
}
148+
return '';
149+
};
150+
```
151+
136152
### **...**
137153

138154
```

solution/1900-1999/1903.Largest Odd Number in String/README_EN.md

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@
4343

4444
## Solutions
4545

46+
**Solution 1: Reverse Traversal**
47+
48+
We can traverse the string from the end to the beginning, find the first odd number, and then return the substring from the beginning to this odd number. If there is no odd number, return an empty string.
49+
50+
The time complexity is $O(n)$, where $n$ is the length of the string $num$. Ignoring the space consumption of the answer string, the space complexity is $O(1)$.
51+
4652
<!-- tabs:start -->
4753

4854
### **Python3**
@@ -72,24 +78,6 @@ class Solution {
7278
}
7379
```
7480

75-
### **JavaScript**
76-
77-
```js
78-
/**
79-
* @param {string} num
80-
* @return {string}
81-
*/
82-
var largestOddNumber = function (num) {
83-
let n = num.length;
84-
for (let j = n - 1; j >= 0; j--) {
85-
if (num.charAt(j) & (1 == 1)) {
86-
return num.slice(0, j + 1);
87-
}
88-
}
89-
return '';
90-
};
91-
```
92-
9381
### **C++**
9482

9583
```cpp
@@ -121,6 +109,36 @@ func largestOddNumber(num string) string {
121109
}
122110
```
123111

112+
### **TypeScript**
113+
114+
```ts
115+
function largestOddNumber(num: string): string {
116+
for (let i = num.length - 1; ~i; --i) {
117+
if (Number(num[i]) & 1) {
118+
return num.slice(0, i + 1);
119+
}
120+
}
121+
return '';
122+
}
123+
```
124+
125+
### **JavaScript**
126+
127+
```js
128+
/**
129+
* @param {string} num
130+
* @return {string}
131+
*/
132+
var largestOddNumber = function (num) {
133+
for (let i = num.length - 1; ~i; --i) {
134+
if (Number(num[i]) & 1) {
135+
return num.slice(0, i + 1);
136+
}
137+
}
138+
return '';
139+
};
140+
```
141+
124142
### **...**
125143

126144
```

solution/1900-1999/1903.Largest Odd Number in String/Solution.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
* @return {string}
44
*/
55
var largestOddNumber = function (num) {
6-
let n = num.length;
7-
for (let j = n - 1; j >= 0; j--) {
8-
if (num.charAt(j) & (1 == 1)) {
9-
return num.slice(0, j + 1);
6+
for (let i = num.length - 1; ~i; --i) {
7+
if (Number(num[i]) & 1) {
8+
return num.slice(0, i + 1);
109
}
1110
}
1211
return '';
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
function largestOddNumber(num: string): string {
2+
for (let i = num.length - 1; ~i; --i) {
3+
if (Number(num[i]) & 1) {
4+
return num.slice(0, i + 1);
5+
}
6+
}
7+
return '';
8+
}

solution/1900-1999/1904.The Number of Full Rounds You Have Played/README.md

Lines changed: 56 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@
6262

6363
<!-- 这里可写通用的实现逻辑 -->
6464

65-
转换为“分钟”进行计算。
65+
**方法一:转换为分钟数**
66+
67+
我们可以将输入的字符串转换为分钟数 $a$ 和 $b$,如果 $a > b$,则说明跨越了午夜,需要将 $b$ 加上一天的分钟数 $1440$。
68+
69+
然后我们将 $a$ 向上取整到 $15$ 的倍数,将 $b$ 向下取整到 $15$ 的倍数,最后返回 $b$ 与 $a$ 的差值即可,注意要取 $0$ 和 $b - a$ 中的较大值。
70+
71+
时间复杂度 $O(1)$,空间复杂度 $O(1)$。
6672

6773
<!-- tabs:start -->
6874

@@ -72,15 +78,15 @@
7278

7379
```python
7480
class Solution:
75-
def numberOfRounds(self, startTime: str, finishTime: str) -> int:
76-
def get(s: str) -> int:
81+
def numberOfRounds(self, loginTime: str, logoutTime: str) -> int:
82+
def f(s: str) -> int:
7783
return int(s[:2]) * 60 + int(s[3:])
7884

79-
start, finish = get(startTime), get(finishTime)
80-
if start > finish:
81-
finish += 24 * 60
82-
start, finish = (start + 14) // 15, finish // 15
83-
return max(0, finish - start)
85+
a, b = f(loginTime), f(logoutTime)
86+
if a > b:
87+
b += 1440
88+
a, b = (a + 14) // 15, b // 15
89+
return max(0, b - a)
8490
```
8591

8692
### **Java**
@@ -89,38 +95,19 @@ class Solution:
8995

9096
```java
9197
class Solution {
92-
public int numberOfRounds(String startTime, String finishTime) {
93-
int start = get(startTime), finish = get(finishTime);
94-
if (start > finish) {
95-
finish += 24 * 60;
98+
public int numberOfRounds(String loginTime, String logoutTime) {
99+
int a = f(loginTime), b = f(logoutTime);
100+
if (a > b) {
101+
b += 1440;
96102
}
97-
start = (start + 14) / 15;
98-
finish /= 15;
99-
return Math.max(0, finish - start);
103+
return Math.max(0, b / 15 - (a + 14) / 15);
100104
}
101105

102-
private int get(String s) {
103-
return Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3));
104-
}
105-
}
106-
```
107-
108-
### **TypeScript**
109-
110-
```ts
111-
function numberOfRounds(startTime: string, finishTime: string): number {
112-
let m1 = toMinutes(startTime),
113-
m2 = toMinutes(finishTime);
114-
if (m1 > m2) {
115-
m2 += 24 * 60;
106+
private int f(String s) {
107+
int h = Integer.parseInt(s.substring(0, 2));
108+
int m = Integer.parseInt(s.substring(3, 5));
109+
return h * 60 + m;
116110
}
117-
let ans = Math.floor(m2 / 15) - Math.ceil(m1 / 15);
118-
return ans > 0 ? ans : 0;
119-
}
120-
121-
function toMinutes(time: string): number {
122-
let [h, m] = time.split(':').map(Number);
123-
return h * 60 + m;
124111
}
125112
```
126113

@@ -129,46 +116,51 @@ function toMinutes(time: string): number {
129116
```cpp
130117
class Solution {
131118
public:
132-
int numberOfRounds(string startTime, string finishTime) {
133-
int start = get(startTime), finish = get(finishTime);
134-
if (start > finish) {
135-
finish += 24 * 60;
119+
int numberOfRounds(string loginTime, string logoutTime) {
120+
auto f = [](string& s) {
121+
int h, m;
122+
sscanf(s.c_str(), "%d:%d", &h, &m);
123+
return h * 60 + m;
124+
};
125+
int a = f(loginTime), b = f(logoutTime);
126+
if (a > b) {
127+
b += 1440;
136128
}
137-
start = (start + 14) / 15;
138-
finish /= 15;
139-
return max(0, finish - start);
140-
}
141-
142-
private:
143-
int get(string s) {
144-
int a, b;
145-
sscanf(s.c_str(), "%d:%d", &a, &b);
146-
return a * 60 + b;
129+
return max(0, b / 15 - (a + 14) / 15);
147130
}
148131
};
149132
```
150133
151134
### **Go**
152135
153136
```go
154-
func numberOfRounds(startTime string, finishTime string) int {
155-
start, finish := get(startTime), get(finishTime)
156-
if start > finish {
157-
finish += 24 * 60
137+
func numberOfRounds(loginTime string, logoutTime string) int {
138+
f := func(s string) int {
139+
var h, m int
140+
fmt.Sscanf(s, "%d:%d", &h, &m)
141+
return h*60 + m
158142
}
159-
start = (start + 14) / 15
160-
finish /= 15
161-
if start > finish {
162-
return 0
143+
a, b := f(loginTime), f(logoutTime)
144+
if a > b {
145+
b += 1440
163146
}
164-
return finish - start
165-
147+
return max(0, b/15-(a+14)/15)
166148
}
149+
```
167150

168-
func get(s string) int {
169-
var a, b int
170-
fmt.Sscanf(s, "%d:%d", &a, &b)
171-
return a*60 + b
151+
### **TypeScript**
152+
153+
```ts
154+
function numberOfRounds(startTime: string, finishTime: string): number {
155+
const f = (s: string): number => {
156+
const [h, m] = s.split(':').map(Number);
157+
return h * 60 + m;
158+
};
159+
let [a, b] = [f(startTime), f(finishTime)];
160+
if (a > b) {
161+
b += 1440;
162+
}
163+
return Math.max(0, Math.floor(b / 15) - Math.ceil(a / 15));
172164
}
173165
```
174166

0 commit comments

Comments
 (0)