劍指offer第七天
阿新 • • 發佈:2018-02-11
包含 存在 例如 保存 模式識別 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”數量的影響包括一下兩個方面:
- 若第i位大於1,則該位1的個數位,高於i的位組成的數字+1倍的10^i;
- 若第i位等於1,則該位1的個數位,高於i的位組成的數字倍的10^i加上後面各位組成的數字加1;
若第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第七天