双指针

一、167 两数之和 II  Easy                                                                                                                    点击此处返回总目录

二、633 平方数之和  Easy

三、345 反转字符串中的元音字母 Easy

四、344 反转字符串  Easy

五、680 验证回文字符串II  Easy

六、88  合并两个有序数组 Easy

七、141 判断链表是否有环 Easy

八、392 判断子序列 Medium

九、524 通过删除字母匹配到字典最长单词 Medium

 

 

一、两数之和II

 

 

 

 

二、平方数之和

【题目】

双指针

【分析】

双指针。跟上一个题目相同。

注意:

1. j可以从Math.sqrt(c)开始往前走。这样少遍历很多数据。

2. while的条件中j可以等于j。允许2*2+2*2=8这种情况存在。

3. i从0开始。允许出现0*0+1*1=1这种情况。

 

【代码】

双指针

 

【结果】

双指针

说明,看了一下最优解,跟我的代码完全一样。不过它只花了7ms,可能是测试的数据不一样吧。

 

 

 

三、反转字符串中的元音字母

【题目】

双指针

【程序】

 

双指针

 

 

【运行结果】

双指针

 

 

四、反转字符串

 

【题目】

双指针

【分析】首尾指针。一起往中间走呗。

 

【代码】

双指针

【结果】

这道题出的题目有问题。之前被人提交的代码传入的参数是String s。所以跑出来之后没有对比性。不过看了一下最好的代码,也是这样。

 

 

五、验证回文字符串II

【题目要求】

              双指针

【分析】

           首尾双指针i,j。

           当i、j指向的元素相等时,同时往前走。知道碰头或者不相等。

           当不相等时,判断去掉i或者去掉j之后的字符串是否为回文串。

 

【代码】

双指针

 

【结果】

双指针

 

 

六、合并两个有序数组

【题目】

双指针

【分析】

设置两个指针分别指向两个数组的最后,然后比较,依次取出大的数,挂到nums1的结尾。

 

【代码】

双指针

【结果】

双指针

虽然现实击败88.15%用户,但是跟最好的结果的代码一样。

 

 

七、判断链表是否又环

【题目】

双指针

双指针

双指针

【分析】

快慢指针。

 

【代码】

双指针

 

 

【结果】

双指针

 

 

 

八、判断子序列

【题目】

双指针

【分析】

方法一:双指针。

定义指针i指向s的第一个元素,定义j指向j的第一个元素。若s[i] == t[j],则i,j都后移。若不等,则j后移。

 

但是这个方法效率不高。效率最高的是使用String的内置函数indexOf()。

 

方法二:indexOf()方法。

对于s中每一个元素c,在t中查找c的开始位置。如果没有找到,则说明t不含有c,则返回false。如果找到了,则从当前找到的地方的下一个位置继续找下一个元素。

 

【代码】

双指针

 

【结果】

双指针

 

 

九、524 通过删除字母匹配到字典最长单词

【题目】

双指针

【分析】

       借鉴上一题的思路。

【代码】

双指针

 

 

 

注意:

1. 以后不能这么写了:

int i=0;

for(;i<d.size();i++){

     String s = d.get(i);

}

这样还不如一句话:

for(String s:d){

}

 

2. int i =0 ; int j = 0; 可以简写为:int i=0,j=0;

 

3. if(j<ch.length()){

         return false;

    }else{

         return true;

    }

可以简写为:

return j==ch.length();

 

4. A.compareTo(B)   

如果A<B ,则返回小于0 的数。如果A>B,则返回大于0的数。

abc < abd

ab < abc

a < d

 

【结果】

 

 

双指针