字符串 双指针问题
力扣 合并有序数组
(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;
};