Skip to content

Commit b96bd27

Browse files
committed
算法刷题
1 parent 39be546 commit b96bd27

File tree

6 files changed

+273
-10
lines changed

6 files changed

+273
-10
lines changed

README.md

+15-10
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
+ [面试题11: 旋转数组的最小数字](offerbook/Test11.md)
1717
+ [面试题12: 矩阵中的路径](offerbook/Test12.md)
1818
+ [面试题13: 机器人的运动范围](offerbook/Test13.md)
19-
+ [面试题14-1: 剪绳子](offerbook/Test14.md)
20-
21-
19+
+ [面试题14-1:剪绳子](offerbook/Test14.md)
20+
+ [面试题14-2:剪绳子](offerbook/Test14.md)
21+
+ [面试题15:二进制中1的个数](offerbook/Test15.md)
22+
+ [面试题16:数值的整数次方](offerbook/Test16.md)
2223

2324

2425

@@ -28,25 +29,21 @@
2829

2930
+ [217. 存在重复元素](leetcode/217.md)
3031
+ [509. 斐波那契数](leetcode/509.md)
32+
+ [191. 位1的个数](leetcode/191.md)
3133

3234
### Medium
3335

3436
+ [240. 搜索二维矩阵 II](leetcode/240.md)
3537
+ [105.从前序与中序遍历序列构造二叉树](leetcode/105.md)
3638
+ [343. 整数拆分](leetcode/343.md)
39+
+ [50. Pow(x, n)](leetcode/50.md)
3740

3841
### Hard
3942

4043
+ [154.寻找旋转排序数组中的最小值 II](leetcode/154.md)
4144

4245

4346

44-
45-
46-
47-
48-
49-
5047
## leetcode(按类型分)
5148

5249
### 数组
@@ -59,10 +56,18 @@
5956

6057
+ [M105.从前序与中序遍历序列构造二叉树](leetcode/105.md)
6158

59+
### 位运算
60+
61+
+ [E191. 位1的个数](leetcode/191.md)
62+
6263
### 递归
6364

6465
+ [E509. 斐波那契数](leetcode/509.md)
66+
+ [M50. Pow(x, n)](leetcode/50.md)
6567

6668
### 动态规划
6769

68-
+ [M343. 整数拆分](leetcode/343.md)
70+
+ [M343. 整数拆分](leetcode/343.md)
71+
72+
73+

leetcode/191.md

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# 191. 位1的个数
2+
3+
## 题目描述
4+
5+
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为[汉明重量](https://baike.baidu.com/item/汉明重量))。
6+
7+
## 示例
8+
9+
示例 1:
10+
11+
```
12+
输入:00000000000000000000000000001011
13+
输出:3
14+
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
15+
16+
```
17+
18+
19+
20+
21+
示例 2:
22+
23+
```
24+
输入:00000000000000000000000010000000
25+
输出:1
26+
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
27+
28+
```
29+
30+
31+
32+
33+
示例 3:
34+
35+
```
36+
输入:11111111111111111111111111111101
37+
输出:31
38+
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
39+
40+
```
41+
42+
43+
44+
45+
提示:
46+
47+
```
48+
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
49+
50+
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。
51+
```
52+
53+
**进阶**:
54+
如果多次调用这个函数,你将如何优化你的算法?
55+
56+
# Code
57+
58+
### Solution1
59+
60+
普通解法
61+
62+
```java
63+
public class Solution {
64+
// you need to treat n as an unsigned value
65+
public int hammingWeight(int n) {
66+
return (int) Integer.toBinaryString(n).chars().mapToObj(c -> (char) c).filter(character -> character == '1').count();
67+
68+
}
69+
}
70+
```
71+
72+
### Solution2
73+
74+
位运算
75+
76+
```java
77+
public class Solution {
78+
// you need to treat n as an unsigned value
79+
public int hammingWeight(int n) {
80+
int mask = 1;
81+
int result = 0;
82+
while (n != 0) {
83+
result += n & mask;
84+
n = n >>> 1;
85+
}
86+
return result;
87+
88+
}
89+
}
90+
```
91+
92+
93+
94+
95+
96+
# 题解
97+
98+
https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/solution/mian-shi-ti-15-er-jin-zhi-zhong-1de-ge-shu-wei-yun/

leetcode/50.md

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 50. Pow(x, n)
2+
3+
## 题目描述
4+
5+
实现 [pow(*x*, *n*)](https://www.cplusplus.com/reference/valarray/pow/) ,即计算 x 的 n 次幂函数。
6+
7+
## 示例
8+
9+
示例 1:
10+
11+
```
12+
输入: 2.00000, 10
13+
输出: 1024.00000
14+
```
15+
16+
17+
18+
19+
示例 2:
20+
21+
```
22+
输入: 2.10000, 3
23+
输出: 9.26100
24+
```
25+
26+
27+
28+
29+
示例 3:
30+
31+
```
32+
输入: 2.00000, -2
33+
输出: 0.25000
34+
解释: 2-2 = 1/22 = 1/4 = 0.25
35+
```
36+
37+
38+
39+
40+
提示:
41+
42+
```
43+
-100.0 < x < 100.0
44+
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
45+
```
46+
47+
48+
49+
# Code
50+
51+
### Solution1
52+
53+
暴力解法
54+
55+
```java
56+
class Solution {
57+
public double myPow(double x, int n) {
58+
if (n == 0 || x == 1) return 1;
59+
double res = 1;
60+
int m = Math.abs(n);
61+
while (m != 0) {
62+
res *= x;
63+
--m;
64+
}
65+
66+
return n > 0 ? res : 1 / res;
67+
}
68+
}
69+
```
70+
71+
### Solution2
72+
73+
74+
75+
# 题解
76+

offerbook/Test14-2.md

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 面试题14-1: 剪绳子
2+
3+
## 题目描述
4+
5+
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
6+
7+
**答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。(与上一题区别之处)**
8+
9+
## 示例
10+
11+
示例 1:
12+
13+
14+
15+
```
16+
输入: 2
17+
输出: 1
18+
解释: 2 = 1 + 1, 1 × 1 = 1
19+
```
20+
21+
22+
23+
24+
示例 2:
25+
26+
```
27+
输入: 10
28+
输出: 36
29+
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
30+
```
31+
32+
33+
34+
35+
提示:
36+
37+
```
38+
2 <= n <= 1000
39+
```
40+
41+
42+
43+
# Code
44+
45+
```java
46+
class Solution {
47+
public int cuttingRope(int n) {
48+
49+
//当 n <= 3 时,按照贪心规则应直接保留原数字,但由于题目要求必须拆分,因此必须拆出一个 1,即直接返回 n - 1;
50+
if (n <= 3) return n - 1;
51+
long result = 0;
52+
//求 n 除以 3 的整数部分 a 和余数部分 b;
53+
int a = n / 3, b = n % 3;
54+
//当 b == 0时,直接返回 3^a
55+
if (b == 0) result = pow(a);
56+
//当 b == 1 时,要将一个 1 + 3转换为 2+2,此时返回 3^{a-1} * 2 * 2
57+
if (b == 1) result = (pow(a - 1) * 2 % 1000000007) * 2;
58+
//当 b == 2 时,返回 3^a * b
59+
if (b == 2) result = (pow(a) * b);
60+
return (int) result % 1000000007;
61+
}
62+
63+
private int pow(int a){
64+
long result = 1;
65+
for (int i = 0; i < a; i++) {
66+
result = (result * 3) % 1000000007;
67+
}
68+
return (int) result;
69+
}
70+
}
71+
```
72+
73+
# 题解
74+
75+
https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/solution/mian-shi-ti-14-ii-jian-sheng-zi-iitan-xin-er-fen-f/
76+

offerbook/Test15.md

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# 面试题15:二进制中1的个数
2+
3+
参见[Leetcode191题](../leetcode/191.md)
4+

offerbook/Test16.md

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# 面试题16:数值的整数次方
2+
3+
参见[Leetcode50题](../leetcode/50.md)
4+

0 commit comments

Comments
 (0)