题目要求
分析
Java没有指针的概念,但我们也不是用的C的指针。这里的指针是指两个数值,代表区间的两个索引,利用双指针的移动表示区间的收缩或者扩张,借此找到所求的解。
我们定义两个int变量 i 和 j 来代表一个区间左右边界的索引
tempSum是指当前区间内所有数值的和。
当tempSum小于目标值M时,将右端点右移(j++),然后改变tempSum的值,即tempSum会变大;
当tempSum大于目标值M时,将左端点右移(i++),然后改变tempSum的值,即tempSum会变小。
在双指针移动的过程中,如果有tempSum==M的情况就将其添加到List里面,等最后输出。
因为两个指针整体是向右移动,也只扫一遍,效率比较高。
左端点大于m/2时就停止,因为只要长度为2的连续序列和就一定大于m,肯定不符合要求,不必浪费时间。
具体的设计还是需要仔细看的:
AC代码(Java语言描述)
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.close();
int tempSum = 3;
List<String> list = new LinkedList<>();
for(int i = 1, j = 2; i <= num/2;) {
if(tempSum == num) {
list.add(i + " " + j);
tempSum -= i;
i++;
} else if(tempSum < num) {
j++;
tempSum += j;
} else {
tempSum -= i;
i++;
}
}
for (String s : list) {
System.out.println(s);
}
}
}
来源:CSDN
作者:进阶的JFarmer
链接:https://blog.csdn.net/weixin_43896318/article/details/104092189