1.题目思路
1. 6.ZigZag Conversion
关键词:构造规律
思路:这个主要就是认识到,中间层是row-2,比如总的7行,中间就是5行。
所以一个完整的循环是2*row-2个元素,然后分为第一,最后,中间来计算。
需要记住的一点是,模块化不是代码的模块化而是逻辑的模块化。
中间层(下标为1到row-1)的计算,维护两个指针,每次就添加并移动小的那个。
2. 8.String to Integer (atoi)
关键词:atoi要求
思路:①最开始的空格②+、-号③后面有其他符号④溢出判断
溢出有两种思路:
A。使用long,这个时候每次x*10+y之后判断。
必须要每次判断,因为如果最后判断,long可能也溢出了。
必须要在ing可能溢出,但是long肯定没有溢出的时候判断。
B。还是使用int,int要在*10之前判断。
分为>MAX/10和==MAX/10并且加数大于MAX后位情况。
3. 13.Roman to Integer
关键词:构造规律
思路:就一个难点,就是它不仅涉及到加,把小的写在大的前面还表示减。
比如V表示5,I表示1,IV表示4,VI表示6
所以这个时候,就用另个连续下标,一前一后。
如果前面的对应值大于等于后面的就是加,否则就是减。
4. 14.Longest Common Prefix
关键词:相与
思路:其实就只需要用一个来遍历比较所有的就可以了。
一直维护一个最短的下标即可。
最终再用这个最短公共下标,随便substr返回即可。
5. 20.Valid Parentheses
关键词:递归
思路:
(1)关键在于如何找到与其真实匹配的括号位置。
比如,先有一个(,但是后面也可能出现(,那么遇到)的时候,
可能并不是匹配第一个的,这个时候可以引入一个计数的机制。
这样就能识别,然后再递归,分别调用目前之间的和目前之后的。
(2)这个问题也可以用栈来求解。只入栈左括号。
遇到右括号的时候,必然是与栈顶元素匹配的。
如果匹配出栈,如果不匹配或者栈为空,返回假。
如果最后栈为空,返回真。
6. 28.Implement strStr()
关键词:构造规则、字符串匹配算法
思路:(1)暴力搜索。就是搜寻右边的字符串是不是左边字符串的字串。
如果是,返回位置。这个设置好长度,进行一位一位判断即可。
(2)KMP、Boyer-Mooer 、Rabin-Karp
7. 38.Count and Say
关键词:构造规则
思路:写一个,产生下一个数的函数。
然后按照N,进行反复调用。
说穿了就是对相同的进行统计,用一个index就能实现。
然后将数量再转换为数。
8. 58.Length of Last Word
关键词:构造规则
思路:
(1)暴力搜索即可。从后往前,先找到第一个非空字符。
然后从这个位置开始,找到第一个空字符,两者相减即可。
(2)用STL暴力搜索。
9. 67.Add Binary
关键词:做加法
思路:就是类似于vector里面的大数加法,
注意可以先把加数和被加数reverse一下,再用。
核心 val=(a+b+carry)%2,carry = (a+b+carry)/2;
补充:范例的标准简化写法,很优美,值得学习。
10. 125.Valid Palindrome
关键词:双指针
思路:两个指针,一个从头,一个从末尾。
向中间移动,遇到了合适的就干,否则就移动。
补充:在移动的时候,先移动第一个到合适的地方,再移动第二个。
如果想着有两个一起移动的判断,这样编码出来很难看。
11. 165.Compare Version Numbers
关键词:转换string为int
思路:就是将数字转换为int,还不用考虑一些特殊情况,输入绝对为数字。
转换一对,比较一次。
如果全部转换完才来比较,效率低些。
12. 344.Reverse String
关键词:遍历
思路:
(1)方向迭代器
(2)下标
(3)swap
(4)STL
13. 345.Reverse Vowels of a String
关键词:双指针
思路:这一题完全类似于125,从两边开始找到合适的元素。
找到后进行某个操作
题目:67、165
(1)取较大的为n,然后里面判断,如果i<length就取i,否则就赋值为某个值
int n = s1.size() > s2.size() ? s1.size() : s2.size();
for(int i = 0; i < n; ++i){
int a = i < s1.size() ? s1[i] : 0;
int b = i < s2.size() ? s2[i] : 0;
...
}
(2)将条件设置为||然后迭代
int index1 = 0, index2 = 0;
while(index1 < s1.size() || index2 < s1.size()){
int a = 0;
while(index1 < s1.size()){
a = s1[index1];
}
int b = 0;
while(index2 < s2.size()){
b = s2[index2];
}
}
(2)相对于(1)还提供了处理上的更大的灵活性。
2.从两头开始向中间移动处理
题目:125、345
int left = 0, right = xx.size() - 1;
while(left < right){
if(left满足的条件){
++left;
}else if(right要满足的条件){
--right;
}else{
do_the_right_thing();
++left;
--right;
}
}
3.如何考虑溢出
题目:8
(1)先用更大的范围类型来存储,然后每变动一次,判断一次
long result = 0;
for(xx;xx;xx){
result = result * 10 + xxx;
if(result > INT_MAX){
return INT_MAX;
}
}
return result;
(2)就用本身类型来存储,在变动之前就进行判断。
int result = 0;
for(xx;xx;xx){
if(result > INT_MAX\10 || (result == INT_MAX\10 && xxx > (INT_MAX%10))){
return INT_MAX;
}else{
result = result * 10 + xxx;
}
}
return result;
①字符--》整数 x-'0'即可
如果用于搜索的迭代器是正向的,返回正向迭代器。
如果用于搜索的迭代器是负向的,返回负向迭代器。
1. 6.ZigZag Conversion
关键词:构造规律
思路:这个主要就是认识到,中间层是row-2,比如总的7行,中间就是5行。
所以一个完整的循环是2*row-2个元素,然后分为第一,最后,中间来计算。
需要记住的一点是,模块化不是代码的模块化而是逻辑的模块化。
中间层(下标为1到row-1)的计算,维护两个指针,每次就添加并移动小的那个。
2. 8.String to Integer (atoi)
关键词:atoi要求
思路:①最开始的空格②+、-号③后面有其他符号④溢出判断
溢出有两种思路:
A。使用long,这个时候每次x*10+y之后判断。
必须要每次判断,因为如果最后判断,long可能也溢出了。
必须要在ing可能溢出,但是long肯定没有溢出的时候判断。
B。还是使用int,int要在*10之前判断。
分为>MAX/10和==MAX/10并且加数大于MAX后位情况。
3. 13.Roman to Integer
关键词:构造规律
思路:就一个难点,就是它不仅涉及到加,把小的写在大的前面还表示减。
比如V表示5,I表示1,IV表示4,VI表示6
所以这个时候,就用另个连续下标,一前一后。
如果前面的对应值大于等于后面的就是加,否则就是减。
4. 14.Longest Common Prefix
关键词:相与
思路:其实就只需要用一个来遍历比较所有的就可以了。
一直维护一个最短的下标即可。
最终再用这个最短公共下标,随便substr返回即可。
5. 20.Valid Parentheses
关键词:递归
思路:
(1)关键在于如何找到与其真实匹配的括号位置。
比如,先有一个(,但是后面也可能出现(,那么遇到)的时候,
可能并不是匹配第一个的,这个时候可以引入一个计数的机制。
这样就能识别,然后再递归,分别调用目前之间的和目前之后的。
(2)这个问题也可以用栈来求解。只入栈左括号。
遇到右括号的时候,必然是与栈顶元素匹配的。
如果匹配出栈,如果不匹配或者栈为空,返回假。
如果最后栈为空,返回真。
6. 28.Implement strStr()
关键词:构造规则、字符串匹配算法
思路:(1)暴力搜索。就是搜寻右边的字符串是不是左边字符串的字串。
如果是,返回位置。这个设置好长度,进行一位一位判断即可。
(2)KMP、Boyer-Mooer 、Rabin-Karp
7. 38.Count and Say
关键词:构造规则
思路:写一个,产生下一个数的函数。
然后按照N,进行反复调用。
说穿了就是对相同的进行统计,用一个index就能实现。
然后将数量再转换为数。
8. 58.Length of Last Word
关键词:构造规则
思路:
(1)暴力搜索即可。从后往前,先找到第一个非空字符。
然后从这个位置开始,找到第一个空字符,两者相减即可。
(2)用STL暴力搜索。
9. 67.Add Binary
关键词:做加法
思路:就是类似于vector里面的大数加法,
注意可以先把加数和被加数reverse一下,再用。
核心 val=(a+b+carry)%2,carry = (a+b+carry)/2;
补充:范例的标准简化写法,很优美,值得学习。
10. 125.Valid Palindrome
关键词:双指针
思路:两个指针,一个从头,一个从末尾。
向中间移动,遇到了合适的就干,否则就移动。
补充:在移动的时候,先移动第一个到合适的地方,再移动第二个。
如果想着有两个一起移动的判断,这样编码出来很难看。
11. 165.Compare Version Numbers
关键词:转换string为int
思路:就是将数字转换为int,还不用考虑一些特殊情况,输入绝对为数字。
转换一对,比较一次。
如果全部转换完才来比较,效率低些。
12. 344.Reverse String
关键词:遍历
思路:
(1)方向迭代器
(2)下标
(3)swap
(4)STL
13. 345.Reverse Vowels of a String
关键词:双指针
思路:这一题完全类似于125,从两边开始找到合适的元素。
找到后进行某个操作
2.题型总结
题目:67、165
(1)取较大的为n,然后里面判断,如果i<length就取i,否则就赋值为某个值
int n = s1.size() > s2.size() ? s1.size() : s2.size();
for(int i = 0; i < n; ++i){
int a = i < s1.size() ? s1[i] : 0;
int b = i < s2.size() ? s2[i] : 0;
...
}
(2)将条件设置为||然后迭代
int index1 = 0, index2 = 0;
while(index1 < s1.size() || index2 < s1.size()){
int a = 0;
while(index1 < s1.size()){
a = s1[index1];
}
int b = 0;
while(index2 < s2.size()){
b = s2[index2];
}
}
(2)相对于(1)还提供了处理上的更大的灵活性。
2.从两头开始向中间移动处理
题目:125、345
int left = 0, right = xx.size() - 1;
while(left < right){
if(left满足的条件){
++left;
}else if(right要满足的条件){
--right;
}else{
do_the_right_thing();
++left;
--right;
}
}
3.如何考虑溢出
题目:8
(1)先用更大的范围类型来存储,然后每变动一次,判断一次
long result = 0;
for(xx;xx;xx){
result = result * 10 + xxx;
if(result > INT_MAX){
return INT_MAX;
}
}
return result;
(2)就用本身类型来存储,在变动之前就进行判断。
int result = 0;
for(xx;xx;xx){
if(result > INT_MAX\10 || (result == INT_MAX\10 && xxx > (INT_MAX%10))){
return INT_MAX;
}else{
result = result * 10 + xxx;
}
}
return result;
3.思考
①字符--》整数 x-'0'即可
②整形--》字符 x+'0'即可
如果用于搜索的迭代器是正向的,返回正向迭代器。
如果用于搜索的迭代器是负向的,返回负向迭代器。