題一:輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,是的他們的和正好是s,若有多對,也要找出來。例如輸入數組a{1,2,4,7,11,13,15},輸出2,13和4,11java
思路:定義兩個指針left,right,一個指針left指向數組的第一個元素,另外一個right指向數組的最後一個元素,默認left爲數組的第一個元素,right爲數組的第最後一個元素.數組
a[left]+a[right]>sum,right--spa
a[left]+a[right]<sum,left++指針
a[left]+a[right]=sum,打印a[left],a[right]code
題二:輸入一個正數s,打印出全部和爲s的連續正數序列(至少含有兩個數)。例如 15=1+2+3+4+5=4+5+6=7+8blog
思路:定義兩個變量small,big,一個變量small初始化爲1,另外一個big初始化爲2,初始序列爲就爲{1,2},序列和爲3。排序
int middle = (1 + sum) / 2,超過middle後面的值相加確定比sum大,所以用它來作while循環的邊界。隊列
當序列和小於sum時增長隊列的個數,即big++;it
當序列和大於sum時,刪除隊列中最小的數,即small++;io
當序列和等於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); } }