算法学习——贪心算法之删数字(求最大值)

算法描述

在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最大值(原次序不变)算法

算法思路

  1. 考虑到是要移出数字,咱们使用链表设计此算法较为方便,链表能够直接移出某个位置的元素设计

  2. 使用贪心算法,每一步都要达到最优code

  3. 从最高位开始,如果下一位比上一位大,则比上一位的数字移出,结束以后再次从最高位开始blog

例如 16489657 删除4个数字
首先比较1和6 删除1 获得 6489657
以后,再次比较 6和4 日后推 可获得 689657
以此类推 删除4个数字以后 可获得 9657ci

这里会有个特殊状况,当一个从大大小的整数输入的时候,咱们得从末尾删除数字才能获得最大值rem

例如 98765 删除5 能够获得最大值 9876get

算法实现

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));
    }

结果

相关文章
相关标签/搜索