前言
在我最近练习算法过程中,发现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,会出现数组越界的情况,而方案二中就避免了该情况的发生。
该文章持续更新中~