输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
设该数为sum,设置分Count 份,平均数ava = sum / count;
,小数flag = (sum % count) / (double) count;
分析可知:
Count | 小数flag | 是否存在序列 |
---|---|---|
偶数 | 0 | 不存在 |
偶数 | 0.5 | 存在 |
奇数 | 0 | 不存在 |
奇数 | 0.5 | 不存在 |
public class Solution {
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
int count = 2; // 数字的数量
int ava = sum / count; //整数部分
double flag = (sum % count) / (double) count; // 小数部分
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
while (true) {
if (flag == 0d && count % 2 != 0) {
int begin = ava - (count - 1) / 2;
int end = ava + (count - 1) / 2;
if(begin <=0 ) break;
ArrayList<Integer> list = new ArrayList<>();
for (int i = begin; i <= end; i++)
list.add(i);
ans.add(0,list);
} else if (flag == 0.5 && count % 2 == 0) {
int begin = ava + 1 - count / 2;
int end = ava + count / 2;
if(begin <=0 ) break;
ArrayList<Integer> list = new ArrayList<>();
for (int i = begin; i <= end; i++) {
list.add(i);
}
ans.add(0,list);
}
count++;
ava = sum / count;
flag = (sum % count) / (double) count;
}
return ans;
}
}
网友评论