【五月集训】第五天打卡(双指针)


917.仅仅反转字母

题目链接

仅仅反转字母

思路

  • 先将字符串转成数组,然后遍历
  • 维护两个指针l,r使l为0,r为数组的最后一位索引
  • 当左右指针都为‘-’时,左指针向右移动,右指针向左移动并进行转换
  • 将数组转成字符串

代码

  • js
function reverseOnlyLetters(s: string): string {
    const chars = s.split('')
    for (let l = 0, r = s.length - 1; l < r;) {
        while (l < r && !((chars[l] >= 'a' && chars[l] <= 'z') || (chars[l] >= 'A' && chars[l] <= 'Z')))
            l++
        while (r > l && !((chars[r] >= 'a' && chars[r] <= 'z') || (chars[r] >= 'A' && chars[r] <= 'Z')))
            r--
        if (l < r) {
            const tmp = chars[l]
            chars[l++] = chars[r]
            chars[r--] = tmp
        }
    }
    return chars.join("")
};

167. 两数之和 II - 输入有序数组

题目链接

两数之和 II - 输入有序数组

思路

  • 创建一个map结构用于记录数字与数字的索引
  • 枚举数组,判断target-当前值在不在map中
  • 若在返回
  • 若不在存入map

代码

  • js
function twoSum(numbers: number[], target: number): number[] {
 let map = new Map()
    for (let i = 0; i < numbers.length; i++) {
        let item = numbers[i]
        if (map.has(target - item)) {
            return [map.get(target - item)+1, i+1]
        } else {
            map.set(item, i)
        }
    }
    return [-1, -1]
};

165. 比较版本号

题目链接

比较版本号

思路

  • 将两个版本号切成数组
  • 遍历数组转成number,若越界则定义为0
  • 比较当前遍历两个元素大小,根据题目要求返回相应结果

代码

  • js
function compareVersion(version1: string, version2: string): number {
    // 使用'.'将版本号分割成为数组
    const [v1, v2] = [version1.split('.'), version2.split('.')];
    // 取两者长度的最大值
    const len = Math.max(v1.length, v2.length);
    for (let i = 0; i < len; i++) {
        // 数组元素逐个转换成数字(数组若越界,则定义为0),然后比较大小
        const num1 = v1[i] ? parseInt(v1[i]) : 0;
        const num2 = v2[i] ? parseInt(v2[i]) : 0;
        if (num1 > num2) {
            return 1;
        } else if (num1 < num2) {
            return -1;
        }
    }
    return 0;
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值