解题思路: 

                找出n中删除k个数字之后的数字最大,实际就是找出n中取m(n-k)个数字的最大值,从前(start)往后(end)依次找出最大值即可

                1、start = 0,end = n.length()  -  length 中找出最大值,限制end的目的是为了让str剩下的数>=m-1,即str[start,end]中找出最大值

                2、取下一个值时,start = start + 1;m-- ;end = n.length()  -  m;

                如:

                    输入:1368547954213248   6

                    第一次从  start = 0,end = 16 - 10 中找到最大值,即从  1368547 中找出最大值8(要保证剩余954213248的长度 >= m - 1)

                    找出第一个数后,下次循环的start = start + 1;m-- ;end = n.length()  -  m;

                    下一次  start = 4,end = 16 - 9 中找到最大值,即从5479中找出最大值9(要保证剩余54213248的长度 >= m - 1),重复此过程

注意事项:

                当剩余长度=m时,即剩下的数量刚好为还要取的数量,则直接添加剩余的数量

                如:剩余 123456789,取9位,则直接添加123456789

参考代码:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String str = sc.next();// 获得字符
    int delete = sc.nextInt();// 获得删除的数量
    int length = str.length() - delete; // 取length位组成最大值
    StringBuffer sb = new StringBuffer();// 存储每次找出的最大值
    int start = 0; // 起点
    int end = delete; // 终点

    while(length != 0){
        // 终止条件,如果剩下来的数刚好的等于要选择的数,则直接输出
       if(str.length() - start == length){
           sb.append(str.substring(start));
           break;
       }
       // 找出起点到终点中的最大值
       char max = str.charAt(start);
       for (int j = start + 1; j <= end; j++) {
           if(max < str.charAt(j)){
               max = str.charAt(j);
               start = j;
           }
       }
       // 取出一个数字,
       sb.append(max);
       // 那么还需要取的数字的数量-1,
       length--;
       // 起点变更为当前数字的下一位,
       start++;
       // 终点变更为总长度-还需要取得位数(要保证剩下的位数>=要取的位数)
       end = str.length() - length;
    }
    System.out.println(sb);
}


点赞(0)
 

0.0分

7 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论