前言
这是俺这个小菜鸡第一次写,希望大佬们轻点喷。如有错误,纯属正常,请多多指教!
这是我在刷蓝桥杯2021模拟赛的一道贪心算法题。我之所以写这个,是我看解答里面很多都是错误的,我估计是因为,一个人错,后面跟着错,虽然那些代码确实AC了,但是确实是有问题的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目:
删除字符
题目描述
给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?
输入描述
输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 t。
其中,单词长度不超过 100,t 小于单词长度。
输出描述
输出一个单词,表示答案。
输入输出样例
示例 1
输入
LANQIAO 3
输出
AIAO
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
二、错误代码:
思路:
如果当前字符大于后一个字符,则删除当前字符。统计删除的字符个数:
- 等于t结束
- 小于t,从字符串后面删除字符
代码如下(示例):
import java.util.*; public class Main { public static void main(String arg[]) { Scanner sc = new Scanner(System.in); ArrayList<Character> list = new ArrayList<Character>(); String Str = sc.next(); int t = sc.nextInt(); for(int i = 0 ; i < Str.length() ; i++) { list.add(Str.charAt(i)); } for(int j = 0 ; j < t ; j++) { if(list.get(0) > list.get(1)){ list.remove(0); }else { list.remove(1); } } for(int n = 0 ; n <list.size() ; n++) { System.out.print(list.get(n)); } sc.close(); } }
问题:
比如是当:
输入
LANIQAO 3
输出
AQAO
二、正解(个人认为):
思路:
如上述例子:"LANIQAO"
- 将接收的字符串转化为字符再转化放入整型数组ch中,同时要定义一个arr数组来存放答案;
- 当要删除的长度size>0时要一直while语句循环,a是记录每次要遍历数组的起始位置,因为后续的a要变化,这里定义一个flag标记a每一次的起始位置,flag+size则是终点,i截至点要<=flag+size,因为每一次要比较的长度一定要大于已经有的长度至少1;如第一次a=0,flag=0,flag+size=3 从L开始到Q(包含)依次比较,选择最小的数字,即最小的字符。求得最小字符是i=1,用a来标记i,那么A前面的所有字符应该删去,这里是L,长度a-flag为1,然后将ch[a]存放在arr里面,随后要size减去长度a-flag,最后a++,因为每次要从当前记录的后一个位置开始遍历;
- 然后要将最后一次定位的ch[a]后面的数据全部存放入arr中,因为这里最后一步还是计算了a++,所以防止数组下标越界arr定义长度的时候是s.length() - size;
- 最后依次遍历arr数组里面的数据就行了,记住将println换print哦,防止换行。
代码如下(示例):
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s = new String(scan.nextLine()); int size = scan.nextInt(); int[] ch = new int[s.length()]; int[] arr = new int[s.length() - size]; int count = 0; int a = 0, flag = a; for (int i = 0; i < s.length(); i++) { ch[i] = s.charAt(i) - 'A'; } while (size > 0) { flag = a; for (int i = a; i <= flag + size; i++) { if (ch[a] >= ch[i]) { a = i; } } size -= (a - flag); arr[count++] = ch[a]; a++; } for (int i = a; i < ch.length; i++) arr[count++] = ch[i]; for (int i = 0; i < arr.length; i++) System.out.print((char)(arr[i] + 'A')); scan.close(); } }
总结
这是第一次发表文章,想以后也可以记录自己,如果说我思考不周,请大佬们,多多指教!
风乍起,合当奋意向人生。加油!