算法描述
在給定的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));
}