算法學習——貪心算法之刪數字(求最大值)
阿新 • • 發佈:2018-10-15
size 算法學習 末尾 最小 條件 求最大值 sca 位數 技術
算法描述
在給定的n位數字,刪除其中的k位數字( k < n),使得最後的n-k為數字為最大值(原次序不變)
算法思路
考慮到是要移出數字,我們使用鏈表設計此算法較為方便,鏈表可以直接移出某個位置的元素
使用貪心算法,每一步都要達到最優
從最高位開始,若是下一位比上一位大,則比上一位的數字移出,結束之後再次從最高位開始
例如 16489657 刪除4個數字
首先比較1和6 刪除1 得到 6489657
之後,再次比較 6和4 往後推 可得到 689657
以此類推 刪除4個數字之後 可得到 9657
這裏會有個特殊情況,當一個從大大小的整數輸入的時候,我們得從末尾刪除數字才能得到最大值
例如 98765 刪除5 可以得到最大值 9876
算法實現
Scanner scanner = new Scanner(System.in); System.out.println("請輸入整數:"); String s = scanner.nextLine(); System.out.println("刪除數字的個數:"); int n = scanner.nextInt(); scanner.close(); int a[] = new int[s.length()]; for(int i=0;i<s.length();i++){ char temp =s.charAt(i); a[i] = temp -'0';//不減去‘0’則會獲得Ascii碼 } LinkedList<Integer> linkedList = new LinkedList<Integer>(); for(int i=0;i<a.length;i++){ linkedList.add(a[i]); } int flag =0; while(flag<n){ for(int i=0;i<linkedList.size()-1;i++){ if(linkedList.get(i)<linkedList.get(i+1)){ linkedList.remove(i);//使用鏈表移出元素 flag++; break;//結束本次循環,跳轉到while循環中 } //考慮到特殊情況,當遍歷完全部數字都不滿足條件,從末尾刪除數字 if(i==linkedList.size()-2){ linkedList.removeLast(); flag++; } } } System.out.print("截取的"+n+"個數字後的最小值為"); for(int i=0;i<linkedList.size();i++){ System.out.print(linkedList.get(i)); }
結果
算法學習——貪心算法之刪數字(求最大值)