删除一个数的K位使原数变得最小

Posted 豪杰冢化尘烟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除一个数的K位使原数变得最小相关的知识,希望对你有一定的参考价值。

原创


给定一个n位正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数。对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小。

提示:应用贪心算法设计求解

操作对象为n位正整数,有可能超过整数的范围,存储在数组a中,数组中每一个数组元素对应整数的一位数字。

在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小。这就是所要选取的贪心策略。

每次删除一个数字,选择一个使剩下的数最小的数字作为删除对象。

当k=1时,对于n位数构成的数删除哪一位,使得剩下的数据最小。删除满足如下条件的a[i]:它是第一个a[i]>a[i+1]的数,如果不存在则删除a[n]。

当k>1(当然小于n),按上述操作一个一个删除。每删除一个数字后,后面的数字向前移位。删除一个达到最小后,再从头即从串首开始,删除第2个,依此分解为k次完成。

若删除不到k个后已无左边大于右边的降序或相等,则停止删除操作,打印剩下串的左边n?k个数字即可(相当于删除了若干个最右边的数字)。

import java.util.Scanner;
class decK{
    private int n;
    private int num[];
    public decK(int n,int k,int num[]){
        this.n=n;
        this.num=num;
        int k_=n-k;
        while(k>=1){
            boolean flag=false;
            for(int i=1;i<n;i++){
                if(num[i]!=-1){
                    if(num[i]>num[i+1]){
                        num[i]=-1;
                        k--;
                        flag=true;
                        break;
                    }
                }
            }
            if(flag==false && k>=1){    //no found num[i]>num[i+1]
                for(int i=1;i<=n;i++){
                    if(num[i]!=-1){
                        System.out.print(num[i]+" ");
                        k_--;
                        if(k_==0){
                            break;
                        }
                    }
                }
                return;
            }
        }
        if(k==0){
            for(int i=1;i<=n;i++){
                if(num[i]!=-1){
                    System.out.print(num[i]+" ");
                }
            }
        }
    }
}
public class subK {

    public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        System.out.print("n:");
        int n=reader.nextInt();
        System.out.print("k:");
        int k=reader.nextInt();
        int num[]=new int[n+1];
        System.out.print(n+" num:");
        for(int i=1;i<=n;i++){
            num[i]=reader.nextInt();
        }
        decK dk=new decK(n,k,num);
    }

}

22:38:28

2018-11-04

以上是关于删除一个数的K位使原数变得最小的主要内容,如果未能解决你的问题,请参考以下文章

2.4

110,排序-计数排序

剑指offer二十九---最小的k个数

找出一堆数中最小的前K个数

最大/最小de K个数/第K个数

剑指Offer-29.最小的K个数(C++/Java)