四数问题下逻辑运算符的注意事项
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
public static List<List<Integer>> fourSum(int[] nums, int target) {
int firs;
int seco;
int thir;
int four;
int temp;
List<List<Integer>> res = new LinkedList<>();
Arrays.sort(nums);
for (firs = 0; firs < nums.length; firs++) {
if (firs > 0 && nums[firs] == nums[firs - 1]) continue;
for (seco = firs + 1; seco < nums.length; seco++) {
if (seco > firs + 1 && nums[seco] == nums[seco - 1]) continue;
thir = seco + 1;
four = nums.length - 1;
while (thir < four) {
temp = nums[firs] + nums[seco] + nums[thir] + nums[four];
if (temp == target) {
res.add(Arrays.asList(nums[firs], nums[seco], nums[thir], nums[four]));
while (thir < four && nums[thir] == nums[thir + 1]) thir++;
while (thir < four && nums[four] == nums[four - 1]) four--;
thir++;
four--;
} else if (temp > target) {
while (four > thir && nums[four] == nums[four - 1]) four--;
four--;
} else {
while (thir < four && nums[thir] == nums[thir + 1] ) thir++;
thir++;
}
}
}
}
return res;
}
以上为第一次写出的解决方法,具体做法是将四数之和转换为外层循环加一个三数之和(而三数之和可以转换为外层循环加双指针问题)。
但是测试时,输入数组{0,0,0,0}与target=0,会在
while (nums[thir] == nums[thir + 1] && thir < four) thir++;
这一语句处报ArrayIndexOutOfBoundsException异常,经过debug后发现,逻辑运算符&&的左右判断语句的顺序影响了程序的正确性。
此时,thir = 3, 先进行判断nums[thir] == nums[thir + 1],然后判断thir < four都满足于是 thir++,此时thir = 4,然后再次进行判断nums[thir] == nums[thir + 1] ,此时thir + 1 = 4,于是就发生数组下标越界的异常。
根据逻辑,每次进行比较前应先判断是否第三个数小于第四个,所以应该将
while (nums[thir] == nums[thir + 1] && thir < four) thir++;
while (nums[four] == nums[four - 1] && thir < four) four--;
中的两个while循环中的逻辑判断顺序调换一下:
while (thir < four && nums[thir] == nums[thir + 1]) thir++;
while (thir < four && nums[four] == nums[four - 1]) four--;
果然调换了一下顺序之后就对了,在进行数组判断之前,会先判断thir < four,若thir = 4,则这时已经不满足了,就不会进行后面的判断。
其实程序是次要的,主要是在进行逻辑判断的时候,一定要注意先后顺序(吃了好几次这样的亏,特此记录一下)。
网址:四数问题下逻辑运算符的注意事项 https://www.yuejiaxmz.com/news/view/72707
相关内容
严密的逻辑=横向逻辑+纵向逻辑+金字塔结构Python实现简单算法乘法:提升编程效率与逻辑思维
计算机日常维护的方法与注意事项(通用8篇)
青年追求精致生活的逻辑与特征
用PHP中的 == 运算符进行字符串比较
折晓叶:“田野”经验中的日常生活逻辑经验、理论与方法
【巧填运算符号:3333=73333=8=】
生活购物的注意事项
小白必读!软件开发各个阶段及注意问题!
汽车保养与维修注意事项.doc