码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-11-07 21:06:18      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:strong   string   color   ++   ret   相等   删除对象   false   void   

原创


给定一个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位使原数变得最小

标签:strong   string   color   ++   ret   相等   删除对象   false   void   

原文地址:https://www.cnblogs.com/chiweiming/p/9906342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!