• Java贪心算法 删数字问题


    问题描述:对给定的n位数字 指定要删除的数字个数 k ,要求删除这k个数之后 ,按照数字原左右顺序 新形成的数字最大

    如输入: 5689   1    表示对于5689 删掉一个数字后    得到最大值       

    应输出 : 689

    贪心算法核心思想就是 :总是做出当前最好的选择    

    那么要删除每一个数时    都从左侧第一个数(最高位)开始比较每两个数字的大小  如果左侧小于右侧  删除左侧数字    这样就保证了最高位上的数字总是一直在变大的   

    比如  21965 这个数  删两位     第一次判断删掉1    第二次判断删除 2    得到结果最优 

    贴出代码 :

    public class 删数字问题 {
    
    
    private static int      k;
    private static int[]data;
    private static intlength;
    
    
    public static void test() {
    for (int i = 0; i < k; i++) {
    boolean isDelete = false; // 判断是否可以覆盖当前数字的标志量
    for (int m = 0; m < length - 1; m++) {
    if ((data[m] < data[m + 1]) && !isDelete) {
    isDelete = true;
    }
    if (isDelete) {
    data[m] = data[m + 1];
    }
    }
    length--; // 不论这个数是不是在遍历的时候是否将isDelete变为true,
          // 循环结束都得将这个长度减1   表示删去了最后的那个数     
    }
    for (int n = 0; n < length; n++) {
    System.out.print("" + data[n]);
    }
    }
    
    
    public static void main(String[] args) {
    data = new int[50];
    Scanner in = new Scanner(System.in);
    String data1 = in.nextLine();
    length = data1.length();
    System.err.println("length = " + length);
    k = in.nextInt();
    String[] data2 = data1.split("");
    for (int j = 0; j < length; j++) {
    data[j] = Integer.parseInt(data2[j]);
    }
    test();
    in.close();
    
    
    }
    }

    输入的是一个String    然后split  分割成String数组      然后 转为int[] 数组     用全局保存

    删除k 个数  就建立一个 for循环,次数为k

    内层循环为了遍历这个数    需要注意的是每次循环结束都需要  删去最后的数字   就是length--  ;

    length是我设置的全局int  表示当前数组的长度   

  • 相关阅读:
    【云原生 | Docker】Linux 定时自动化备份Mysql数据到本地 & Windows 最佳实践,确定不来看看?
    java实现如何将百万级数据高效的导出到Excel表单
    NumPy使用不当引起的内存泄漏
    Docker:部署微服务集群
    [③ADRV902x]: Digital Filter Configuration(接收端)
    macOS逆向-如何分析macOS软件
    Nginx配置实例-反向代理
    ZNS SSD是否真的前途一片光明?
    【LeetCode】有序矩阵中第 K 小的元素 [M](二分)
    AUTOSARCAN-Tp协议
  • 原文地址:https://blog.csdn.net/lengyue815/article/details/128010843