/** * 题目: * 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。 * 但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。 * 没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! */ import java.util.ArrayList; public class P282_FindContinuousSequence { public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum){ ArrayList<ArrayList<Integer>> result = new ArrayList<>(); //因为至少要包括两个数,要求的是正整数序列,那么最小的和为3 if (sum < 3) { return result; } //用来记录正整数序列中最小的数 int small = 1; //用来记录正整数序列中最大的数 int big = 2; //当前序列总和 int curSum = small + big; //序列之和为sum的数至少包括两个数,所以small<mid int mid = (sum + 1) / 2; while (small < mid) { //当前的序列和大于sum while(curSum > sum && small < mid) { curSum = curSum-small; small++; } //当前序列和为sum了,则将这些数加入到list中 if (curSum == sum) { ArrayList<Integer> temp = new ArrayList<>(); temp = add(temp, small, big); result.add(temp); } //当前的序列和小于sum big++; curSum = curSum + big; } return result; } public ArrayList<Integer> add(ArrayList<Integer> temp, int small, int big) { for (int i = small; i <= big; i++) { temp.add(i); } return temp; } public static void main(String[] args) { int sum = 15; P282_FindContinuousSequence test = new P282_FindContinuousSequence(); ArrayList<ArrayList<Integer>> result = test.FindContinuousSequence(sum); System.out.println(result); } }
剑指offer:和为s的连续正数序列(java)
猜你喜欢
转载自blog.csdn.net/Sunshine_liang1/article/details/82874387
今日推荐
周排行