解题思路:
找出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分
7 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复