String操作
6.Z字形变换保存
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解题利用N个string来实现元素的存储,0123210123,然后进行顺序的反转实现元素的保存
1 | string convert(string s, int numRows) { |
14.String的最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
输入: [“flower”,”flow”,”flight”]
输出: “fl”
输入: [“dog”,”racecar”,”car”]
输出: “”
解释: 输入不存在公共前缀。
1 | string longestCommonPrefix(vector<string>& strs) { |
763.String划分最多字母区间
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。
输入:S = “ababcbacadefegdehijhklij”
- 输出:[9,7,8]
- 解释:
- 划分结果为 “ababcbaca”, “defegde”, “hijhklij”。
- 每个字母最多出现在一个片段中。
- 像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。
1 | vector<int> partitionLabels(string S) { |
43. 字符串相乘
输入: num1 = “123”, num2 = “456”
- 输出: “56088”
1 | string multiply(string num1, string num2) { |
数字操作
7./ 剑指67.整数反转
输入: 123
- 输出: 321
输入: -123
- 输出: -321
输入: 120
- 输出: 21
1
2
3
4
5
6
7
8
9
10
11
12int reverse(int x) {
int maxx = INT_MAX;
int minn = INT_MIN;
long temp = 0;
while (x) {
temp = x % 10 + temp * 10;
x /= 10;
}
return (int)(temp > maxx || temp < minn ? 0 : temp);
}
8. / 剑指67. 字符串转换整数 (atoi)
输入: “42”
- 输出: 42
输入: 输入: “ -42”
- 输出: -42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31int strToInt(string str) {
//去重
long res = 0;
bool negative = true;
int i = 0;
while (str[i] == ' ')
i++;
if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-')//非数字,正负号return
return 0;
if (str[i] == '-') {
negative = false;
i++;
}
else if (str[i] == '+') {
negative = true;
i++;
}
//累加数字
while (isdigit(str[i])) {
res = res * 10 + str[i] - '0';
if (negative == true && res > INT_MAX)
return INT_MAX;
if (negative == false && -res < INT_MIN)
return INT_MIN;
i++;
}
return negative ? res : -res;
}
9. 判断回文数
1 | bool isPalindrome(int x) |
172. 阶乘后的零
算一下乘法因子里5的个数
1 | int trailingZeroes(int n) { |
258.各位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
1 | int addDigits(int num) { |
数组操作
54. / 剑指29.螺旋打印矩阵
1 |
|
73.矩阵置零
用第一行第一列作标志位,然后再对第一行第一列进行处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46void setZeroes(vector<vector<int>>& matrix) {
if (matrix.size() == 0)
return;
int m = matrix.size();
int n = matrix[0].size();
bool firstRow = false;
bool firstCol = false;
//第一行和第一列做标识位
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
const int item = matrix[i][j];
if (item == 0) {
if (i == 0) {
firstRow = true;
}
if (j == 0) {
firstCol = true;
}
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
const int item = matrix[i][j];
if (matrix[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
// 修改第一行和第一列
if (firstRow) {
for (int i = 0; i < n; i++) {
matrix[0][i] = 0;
}
}
if (firstCol) {
for (int i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
}
581.最短无序连续子数组
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
解:从左往右,从右往左遍历,找到不满足条件的位置,两者相减
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21int findUnsortedSubarray(vector<int>& nums) {
if (nums.size() <= 1)
return 0;
int tmp1 = INT_MIN;
int tmp2 = INT_MAX;
int indexL = 0;
int indexR = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] < tmp1)
indexR = i;
tmp1 = max(tmp1, nums[i]);
}
for (int i = nums.size() - 1; i >= 0; i--) {
if (nums[i] > tmp2)
indexL = i;
tmp2 = min(tmp2, nums[i]);
}
return indexR == indexL ? 0 : indexR - indexL + 1;
}
945.使数组唯一的最小增量
给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。
返回使 A 中的每个值都是唯一的最少操作次数。
输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15int minIncrementForUnique(vector<int>& A) {
if (A.size() == 0)
return 0;
sort(A.begin(), A.end());
int res = 0;
for (int i = 1; i < A.size(); i++) {
if (A[i] <= A[i - 1]) {
int temp = A[i];
A[i] = A[i - 1] + 1;
res = res + A[i] - temp;
}
}
return res;
}
152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
遇负反转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17double maxProduct(vector<double> arr) {
double res = INT_MIN;
double maxx = 1;
double minn = 1;
for (int i = 0; i < arr.size(); i++) {
//预到负数反转
if (arr[i] < 0) {
swap(maxx, minn);
}
maxx = max(arr[i], arr[i] * maxx);
minn = min(arr[i], arr[i] * minn);
res = max(res, maxx);
}
return res;
}