【蓝桥杯】删除字符——Java

前言

这是俺这个小菜鸡第一次写,希望大佬们轻点喷。如有错误,纯属正常,请多多指教!

这是我在刷蓝桥杯2021模拟赛的一道贪心算法题。我之所以写这个,是我看解答里面很多都是错误的,我估计是因为,一个人错,后面跟着错,虽然那些代码确实AC了,但是确实是有问题的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目:

删除字符

题目描述

给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?

输入描述

输入的第一行包含一个单词,由大写英文字母组成。

第二行包含一个正整数 t。

其中,单词长度不超过 100,t 小于单词长度。

输出描述

输出一个单词,表示答案。

输入输出样例

示例 1

输入

LANQIAO
3


输出

AIAO

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

二、错误代码:

思路:

如果当前字符大于后一个字符,则删除当前字符。统计删除的字符个数:

  1. 等于t结束
  2. 小于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"

  1. 将接收的字符串转化为字符再转化放入整型数组ch中,同时要定义一个arr数组来存放答案;
  2. 当要删除的长度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++,因为每次要从当前记录的后一个位置开始遍历;
  3. 然后要将最后一次定位的ch[a]后面的数据全部存放入arr中,因为这里最后一步还是计算了a++,所以防止数组下标越界arr定义长度的时候是s.length() - size
  4. 最后依次遍历arr数组里面的数据就行了,记住将printlnprint哦,防止换行。

代码如下(示例):

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();
	}
}


总结

这是第一次发表文章,想以后也可以记录自己,如果说我思考不周,请大佬们,多多指教!

        风乍起,合当奋意向人生。加油!

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值