字节2019春招研发编程题

万万没想到之聪明的编辑

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32M,其他语言64M

我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发现拼写错误的捷径:

  1. 三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello
  2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello
  3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC

我特喵是个天才!我在蓝翔学过挖掘机和程序设计,按照这个原理写了一个自动校对器,工作效率从此起飞。用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!
……
万万没想到,我被开除了,临走时老板对我说: “做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。” 我现在整个人红红火火恍恍惚惚的……

请听题:请实现大锤的自动校对程序

数据范围: ,每个用例的字符串长度满足

输入描述:
第一行包括一个数字N,表示本次用例包括多少个待校验的字符串。

后面跟随N行,每行为一个待校验的字符串。

输出描述:
N行,每行包括一个被修复后的字符串。

输入例子1:

2
helloo
wooooooow

输出例子1:

hello
woow

输入例子2:

1
nowcoder

输出例子2:

nowcoder

思路:我们需要注意三个条件
1.第一个便是重复超过2个的字符 超过部分需要删除掉
2.aabb格式需要变为aab格式
3.aabbcc格式需要变为 aabcc…aaaabbbcc 变为 aabcc等等等
第一个条件 我们只需要记录字符的重复数量 超出部分 删除即可
第二个条件我们需要记录上个字符是否为重复项来确定当前字符是否需要去重
刚开始做到这里我已经忽略了第三个条件 导致输入 aabbcc 结果为 aabc 前两个逻辑的结合是只要上个是重复项后续所有都去重 不符合题意
第三个条件 我在这里加入了一个记录上个字符被操作后剩余的长短 若为1说明剩余一个 当前若为aa 则无需操作 若aaaa则变为aa 同时记录长短 到下个字符 若前后构成aabb 删除后者变为aab 并记录字符操作后长短 并将表示上个重复是否符合规则的变量标记为false
下面代码含有注释

		public static void main(String args[]){Scanner scanner = new Scanner(System.in);int count = scanner.nextInt();//共几次输入while (count>0){StringBuilder st = new StringBuilder(scanner.next());int temp = 0;//记录当前重复出现次数int len = 1;//上个字符操作后的长度boolean b = false;//表示上个重复是否符合规则for (int j = 0; j < st.length()-1 ; j++) {if (st.charAt(j)!=st.charAt(j+1)){//已经最少有两个字母连续b = false;if (temp>=1){ //表示重复了b = true;//标记为上个字母重复了}if (len==1){//上个字符已被操作剩余1b=false;}//重置各记录变量len = 1;temp = 0;}//当前字符与下一个字符相同 记录并判断是否需要操作字符if (st.charAt(j)==st.charAt(j+1)){temp++;len++;if (b||temp>=2){st.deleteCharAt(j+1);len--;j--;}}}System.out.println(st);count--;}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部