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

算法描述

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

算法思路

  1. 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素
  2. 使用贪心算法,每一步都要达到最优
  3. 从最高位开始,若是下一位比上一位大,则比上一位的数字移出,结束之后再次从最高位开始

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

    

结果

原文地址:https://www.cnblogs.com/kexing/p/9792605.html

时间: 2024-10-31 12:56:53

算法学习——贪心算法之删数字(求最大值)的相关文章

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

算法描述 在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最小值(原次序不变) 算法思路 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素 使用贪心算法,每一步都要达到最优 从最高位开始,若下一位比上一位要小,则将上一位的数字移出,结束之后再次从最高位开始 这里需要注意,会有特例 当输入从小到大的的一个数的时候,上述算法将会无法运行,比如123456,删除1个数字变为最小,我们把6删去,这样才是最小的(即从末尾删除数字) 算法实现

算法学习——贪心算法之可拆背包

算法描述 已知道n种物品和一个可容纳c重量的背包,第i种物品的重量为wi,价值为pi,装包的时候可以把物品拆开(即可只装每种物品的一部分),设计如何装包,使装包所得整体的价值最高? 算法思路 首先,我们要知道,n种物品以及他们对应的价值,都是由用户输入的 我们使用贪心算法,每一步取最大效益的物品放入背包之中(及单位价值为最高的物品 单位价值=pi/wi) 由以上思路,我们可以定义一个二维数组来接收用户输入的数值 w[i][0] 代表了第i种物品的重量(即wi) w[i][1] 代表了第i种物品的

算法学习——贪心算法之币种统计

算法描述 币种统计 单位给每一位员工发工资(精确到元),为了保证不临时换零钱,使得每个员工取款的张数最少,在取工资前统计所有员工所需要的各种票面的张数(约定票种为100,50,20,10,5,2,1元),并验证币种统计是否正确 算法思路 算法描述其实是省略了要求,用户肯定是要输入员工数以及各位员工的工资 定义:n位员工,G[n]对应了第n员工的工资 a数组存放100元到1元的面值,a[0]=100,a[1]=50... b数组对应每个面值的张数,b[0]对应100元的张数,b[1]对应50元的张

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

五大算法思想—贪心算法

贪心法理解 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变.换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优. 一句话:不求最优,只求可行解. 判断贪心法 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解? 我们可以根据贪心法的2个重要的性质去证明:贪心选择性质和最优子结构性质. 1.贪心选择性质 什么叫贪心选择?从字义上就是贪心也就是目光短线,贪图眼前利益,在

算法导论--贪心算法与动态规划(活动选择问题)

活动选择问题 有一个教室,而当天有多个活动,活动时间表如下:找出最大兼容活动集!活动已按结束时间升序排序. 动态规划 采用动态规划需要满足两个条件:1.最优子结构2.子问题重叠 令Sij表示在ai结束后和aj开始前活动的集合,假定Aij为活动集合Sij的最大兼容子集,其中包含活动ak.问题变成求Sik与Skj最大兼容活动子集Aik与Akjz.我们用c[i,j]表示Sij的最优解的大小. 则c[i,j] = c[i,k]+c[k,j]+1;最后我们需要遍历所有可能的k值,找出最大的一个划分作为c[

算法导论----贪心算法,删除k个数,使剩下的数字最小

先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的: 1.先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取

算法学习:后缀数组 height的求取

[定义] [LCP]全名最长公共前缀,两个后缀之间的最长前缀,以下我们定义 lcp ( i , j ) 的意义是后缀 i 和 j 的最长前缀 [z函数] 函数z [ i ] 表示的是,第 i 个后缀和字符串的最长前缀  [解决问题] 这两个算法都是在解决这个问题 即求后缀和字符串和后缀之间的最长公共前缀 但是有所不同的是, 后缀数组最终求出的是,字典序第 i 个后缀和第 i + 1 个后缀的最长公共前缀 z函数最终求出的是,第 i 个后缀和字符串的最长公共前缀 然后通过这个最长公共前缀求一些其他

增强学习贪心算法与Softmax算法

(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中:小k表示第k个摇臂.因为大K表示摇臂总数:n表示尝试的次数,vn表示第n次尝试的奖赏. Qn的直观意思为:为前n-1次的平均奖赏.当其与n-1相乘所得是前n-1次总奖赏.再加上第n次的奖赏,处于n,则为n次的平均奖赏. 其中:argmax为选取最优的Q(i).count是从0开始的,故count(