For循环的巧妙用法

87 阅读2分钟

前言

在我最近练习算法过程中,发现for循环总是用不恰当,总是无法达到令我满意的程度,因此我写下这篇文章。文章主体采用问答的方式,一起感受for循环的魅力所在,大家可供参考,谢谢

一问

如何不遍历字符串最后一位?

String s = "abc,";
// 方案一
for(int i = 0; i < s.length() - 1; i++){
    System.out.println(s.charAt(i));
}
// 方案二
for(int i = 1; i < s.length(); i++){
    System.out.println(s.charAt(i - 1));
}

可以明显看到方案一更直观,但是方案二就没有它的优点了吗?

二问

比较数组左侧数字是否相同,相同返回1,不同返回0

特殊情况:若左侧没有数字返回-1

例如:输入[1,3,3,4,4,0] 返回[-1,0,1,0,1,0]

采用方案一的写法:

public static int[] compare(int[] arr) {
    // 创建一个与输入数组相同长度的新数组来存储结果
    int[] result = new int[arr.length];
    // 初始化第一个元素的结果为-1,因为左侧没有数字
    result[0] = -1;
    for (int i = 0; i < arr.length - 1; i++) {
        if (arr[i] == arr[i + 1]) {
            result[i + 1] = 1; // 相同,则对应位置设为1
        } else {
            result[i + 1] = 0; // 不同,则对应位置设为0
        }
    }
    return result;
}

采用方案二的写法:

public static int[] compare(int[] arr) {
    // 创建一个与输入数组相同长度的新数组来存储结果
    int[] result = new int[arr.length];
    // 初始化第一个元素的结果为-1,因为左侧没有数字
    result[0] = -1;
    // 遍历数组,从第二个元素开始(因为第一个元素已经处理)
    for (int i = 1; i < arr.length; i++) {
        // 比较当前元素与左侧元素
        if (arr[i] == arr[i - 1]) {
            result[i] = 1; // 相同,则对应位置设为1
        } else {
            result[i] = 0; // 不同,则对应位置设为0
        }
    }
    return result;
}

大家感觉到不同了吗?

在方案一中,由于i+1的问题,如果我们习惯的写i < arr.length,会出现数组越界的情况,而方案二中就避免了该情况的发生。

该文章持续更新中~