1. 程式人生 > >劍指offer第七天

劍指offer第七天

包含 存在 例如 保存 模式識別 post 測試 mark 輸入一個整數

30.連續子數組的最大和

HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。你會不會被他忽悠住?(子向量的長度至少是1)

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        //當輸入無效時,返回0
        if(array == null || array.length == 0) return 0;
        int[] DP = new int[array.length];
        DP[0] = array[0];
        int max = DP[0];
        for(int i = 1; i < array.length ; i++){
            //DP[i]表示以array[i]為結尾的最大連續子序列
            DP[i] = Math.max(DP[i-1]+array[i],array[i]);
            max = Math.max(max,DP[i]);
        }
        return max;
    }
}

31.1~n整數中1出現的次數

輸入一個整數n,求1~ n個整數的十進制表示中1出現的次數,例如:輸入13,1~13中包含1的數字有1、10、11、12、13因此共出現6次。

解題思路:

思路:
n中每一位數字對整體“1”數量的影響包括一下兩個方面:

  1. 若第i位大於1,則該位1的個數位,高於i的位組成的數字+1倍的10^i;
  2. 若第i位等於1,則該位1的個數位,高於i的位組成的數字倍的10^i加上後面各位組成的數字加1;
  3. 若第i位小於1,則該位1的個數位,高於i的位組成的數字倍的10^i;

    import java.util.ArrayList;
    public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        if(n<=0) return 0;
        //用於將int的每一位數字保存在int[]數組中
        ArrayList<Integer> number = new ArrayList<>();
        int totalNums = 0;
        //已分析過的高位數字組成的乘子
        int mult = 0;
        int temp = n;
        while(temp!=0){
            number.add(temp%10);
            temp = temp/10;
        }
        for(int i = number.size()-1;i>=0;i--){
            int nums = (int)(Math.pow(10,i));
            if(number.get(i) == 1){
                totalNums += (int)(n % Math.pow(10,i) + 1);
            }else if(number.get(i) > 1){
                totalNums += (int)(Math.pow(10,i));
            }else if(number.get(i) == 0){
            }
            totalNums += mult * nums;
            mult = mult * 10 + number.get(i);
        }
        return totalNums;
    }
    }

劍指offer第七天