算法总结2

86 阅读2分钟

字符串 双指针问题

力扣 合并有序数组

(88. 合并两个有序数组 - 力扣(LeetCode))
思路:
1.采用两个指针i,j分别指向数组1的结尾和数组2的结尾,再定义一个指针index指向数组1扩充后的数组的结尾
2.比较i,j指针指向的数字谁大,谁就填在index位置,后index--,i--|| j--
3.特殊值问题(当数组数组1足够大,最后只剩下数组2的元素时,要对数组2的元素进行填充)
代码:

var merge = function(nums1, m, nums2, n) {
//三个指针
let index=m+n-1
let i=m-1
let j=n-1
while(i>=0&&j>=0){
    nums1[index--]=nums1[i]>=nums2[j]?nums1[i--]:nums2[j--]
}
//特殊,还剩下数组2的元素时(此时不能进入上一个循环,因为数组1已经被循环完了,i=-1)
while(j>=0){
    nums1[index--]=nums2[j--]
}
};

力扣 比较版本号问题

(165. 比较版本号 - 力扣(LeetCode))
思路:
1.采用双指针思想,一个段一个段的比较版本号。
2.每个段首先进行0的排除(while循环,如果是零,指针向后移),然后开启一个while循环,将段里面的非0数字进行抽离,遇到“.”,则退出循环。得到一个段的字符串,Number(nums1),得到数字。然后对第n段进行比较。相等则返回循环,比较第n+1个段。不相等则返回相应的值。
代码:

var compareVersion = function(version1, version2) {
 let p1 = 0;
        let p2 = 0;
        //p1,p2是字符串的指针
        while (p1 < version1.length || p2 < version2.length) {
          let num1 = 0;
          while (version1[p1] == "0") {
            p1++;
          }
          while (version1[p1] !== "."&&version1[p1]) {
              num1 += version1[p1++];
          }
          //跳过.
          p1++;
          let num2 = 0;
          while (version2[p2] == "0") {
            p2++;
          }
          while (version2[p2] !== "."&&version2[p2]) {
              num2 += version2[p2++];
          }
          p2++;
          n1 = Number(num1);
          n2 = Number(num2);
          if(n1>n2){
            return 1
          }
          if(n1<n2){
            return -1
          }
        }
        return 0;

};

总结

两道题都采用的双指针方法。第一道还可以用排序来做,但是时间复杂度高。第二道题还可用split来做,但是空间复杂度高。