题一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的他们的和正好是s,如有多对,也要找出来。例如输入数组a{1,2,4,7,11,13,15},输出2,13和4,11
思路:定义两个指针left,right,一个指针left指向数组的第一个元素,另一个right指向数组的最后一个元素,默认left为数组的第一个元素,right为数组的第最后一个元素.
a[left]+a[right]>sum,right--
a[left]+a[right]<sum,left++
a[left]+a[right]=sum,打印a[left],a[right]
题二:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如 15=1+2+3+4+5=4+5+6=7+8
思路:定义两个变量small,big,一个变量small初始化为1,另一个big初始化为2,初始序列为就为{1,2},序列和为3。
int middle = (1 + sum) / 2,超过middle后面的值相加肯定比sum大,因此用它来做while循环的边界。
当序列和小于sum时增加队列的个数,即big++;
当序列和大于sum时,删除队列中最小的数,即small++;
当序列和等于sum时,打印small--big之间的数,作为一组结果。
具体参考代码如下:
package test; import java.util.ArrayList; public class Solution { /** * 输入一个递增排序的数组和一个数字s,在数组中查找两个数,是的他们的和正好是s,如有多对,也要找出来。 * @param sum * @param a */ public void FindNumberWithSum(int sum, int[] a) { if (a == null) return; int left = 0; int right = a.length - 1; while (left < right) { int curSum = a[left] + a[right]; if (curSum == sum) { System.out.println(a[left] + " " + a[right]); left++; } else if (curSum > sum) { right--; } else { left++; } } } /** * 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。 * @param sum * @return */ public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); if (sum < 3) return result; int small = 1; int big = 2; //超过middle后面的值相加肯定比sum大,因此用它来做while循环的边界 int middle = (1 + sum) / 2; int curSum = small + big; while (small < middle) { if (curSum == sum) { ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = small; i <= big; i++) { list.add(i); } result.add(list); curSum -= small; small++; } else if (curSum > sum) { curSum -= small; small++; } else { big++; curSum += big; } } return result; } @org.junit.Test public void TestFindContinuousSequence() { FindContinuousSequence(15); } @org.junit.Test public void TestFindNumberWithSum() { int[] a = { 1, 2, 4, 7, 11, 13, 15 }; FindNumberWithSum(15, a); } }