和爲s的兩個數字VS和爲s的連續正數序列

題一:輸入一個遞增排序的數組和一個數字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);
    }
}
相關文章
相關標籤/搜索