您的位置:首页 > 其它

LeetCode---2.StringEasy

2016-07-15 20:36 183 查看
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,从两边开始找到合适的元素。

找到后进行某个操作

2.题型总结

1.遍历比较两个长度不同的字符串、容器

题目: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.思考

1.字符类型数字和整数的转换:

①字符--》整数  x-'0'即可
②整形--》字符  x+'0'即可

2.STL返回的迭代器

如果用于搜索的迭代器是正向的,返回正向迭代器。

如果用于搜索的迭代器是负向的,返回负向迭代器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: