四数问题下逻辑运算符的注意事项

发布时间:2024-11-14 14:41

给定一个包含 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

随便看看