【蓝桥杯】删除字符——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 list = new ArrayList(); 
                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 

 问题:

        比如是当:

        输入

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


总结

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

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

你可能感兴趣的:(蓝桥杯,java,eclipse)