【英雄算法联盟】6月集训Day5.双指针

本文解析了四个编程题目,涉及字符串操作(反转前缀与字母)、供暖器问题中的区间匹配、以及寻找数组中最小差值的算法。通过实例展示了如何利用Java或类似语言实现这些技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目1:2000. 反转单词前缀

记录下标记的位置后,就从头开始交换头尾(两个指针i,idx)进行反转,

class Solution {
    public String reversePrefix(String word, char ch) {
        int len = word.length();
        char[] arr = word.toCharArray();
        int idx = 0;
        for (int i = 0; i < len; i++) {
            if (arr[i] == ch) {
                idx = i;
                break;
            }
        }
        int i = 0;
        while (i < idx) {
            char temp = arr[i];
            arr[i++] = arr[idx];
            arr[idx--] = temp;
        }
        return String.valueOf(arr);
    }
}
题目2:917. 仅仅反转字母

在反转之前,先判断当前字符是不是英文字符Character.isLetter(),然后再进行反转

class Solution {
    public String reverseOnlyLetters(String s) {
        int len = s.length();
        char[] arr = s.toCharArray();
        for (int i = 0, j = len - 1; i < j; ) {
            while (i < j && !Character.isLetter(arr[i])) {
                i++;
            }
            while (i < j && !Character.isLetter(arr[j])) {
                j--;
            }
            if (i < j) {
                char temp = arr[i];
                arr[i++] = arr[j];
                arr[j--] = temp;
            }
        }
        return String.valueOf(arr);
    }
}
题目3:475. 供暖器

两个数组都先排序好,然后针对

class Solution {
    public int findRadius(int[] houses, int[] heaters) {
        Arrays.sort(houses);
        Arrays.sort(heaters);
        int ans = 0;
        for (int i = 0, j = 0; i < houses.length; i++) {
            int curDistance = Math.abs(houses[i] - heaters[j]);
            while (j < heaters.length - 1 && Math.abs(houses[i] - heaters[j]) >= Math.abs(houses[i] - heaters[j + 1])) {
                j++;
                curDistance = Math.min(curDistance, Math.abs(houses[i] - heaters[j]));
            }
            ans = Math.max(ans, curDistance);
        }
        return ans;
    }
}

题目4:面试题 16.06. 最小差

这道题就是教育我们看好题目的边界条件,以及返回值的说明

class Solution {
    public int smallestDifference(int[] a, int[] b) {
        Arrays.sort(a);
        Arrays.sort(b);
        long min = Long.MAX_VALUE;
        for (int i = 0, j = 0; i < a.length&&j < b.length; ) {
            long minus = Math.abs((long)a[i] - (long)b[j]);
            min = Math.min(min, minus);
            if (a[i] > b[j]) {
                j++;
            } else {
                i++;
            }
        }
        return (int)min;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值