首页 > 其他分享 >【大厂面试题-字节】2019春招面试第一题

【大厂面试题-字节】2019春招面试第一题

时间:2022-12-07 22:00:24浏览次数:77  
标签:面试题 窗口 charAt temp 元素 2019 春招 words append

题目描述

我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。
我发现一个发现拼写错误的捷径:
1.三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello
2.两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello
3.上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC
请听题:请实现大锤的自动校对程序
注:题目删除了部分赘述,包括输入输出等,仅保留最终需要我们实现的部分

示例

输入:wooooooow输出:woow

思路

首先题目要求很明确,给你一个字符串,按照规则对字符串进行修改,规则也很明确,AAA型,AABB型属于有误字符串,去掉最后一个字符之后就能成为正常字符串。我们可以看到,需要进行校验的字符串,有明显的区间范围,即3个或者4个时候,我们才需要判断它是否合规,是否需要矫正,所以能够很容易的想到滑动窗口,每次对窗口中的字符进行校验,窗口前面的字符表示确认合规,窗口之中的字符表示正在校验,窗口之后的字符表示待验证。图片
接下来我们分析一下怎么进行窗口滑动,从做到右遍历元素
1.当窗口内仅有一个元素时,此时我们判断当前元素是否等于窗口内元素
等于,则当前元素与窗口内元素结合可能出现AAA型或者AABB型,需要将当前元素加入窗口中,继续往后遍历;
不等于,则窗口内元素可以判定为通过校验,从窗口中移除,并且计入最终字符串中,然后将当前元素放入窗口中,进行下一次的校验。
2.当窗口中存在两个元素,并且依据1的操作逻辑,这两个元素一定相等。此时我们判断当前元素是否等于窗口内元素
等于,则当前元素与窗口内元素结合成为AAA型,不符合规则,直接将当前元素丢弃,继续往后遍历
不等于,当前元素与窗口内元素结合可能成为AABB型,所以将当前元素放入窗口中,进行下一次的判断
3.当窗口中存在3个及以上元素时(最多只会3个),依据1,2的逻辑,此时窗口中存在的元素应该为AAB型,我们需要判断当前元素是否等于窗口中B型的元素
等于,则当前元素与窗口中元素结合成为AABB型,不符合规则,直接丢弃当前元素,继续往后遍历
不等于,则窗口中元素通过校验,直接从窗口中移除,并且计入最终字符串中,然后将当前元素放入窗口中,进行下一次校验

实现

 public String repairSpell(String words) {
   //最终字符串
        StringBuilder answer = new StringBuilder();
   //记录窗口内元素
        StringBuilder temp = new StringBuilder();
        temp.append(words.charAt(0));
        for (int i = 1 ; i < words.length() ; i++) {
            if (temp.length() == 1) {
                if (words.charAt(i) == temp.charAt(0)) {
                    temp.append(words.charAt(i));
                } else {
                    answer.append(temp);
                    temp.setLength(0);
                    temp.append(words.charAt(i));
                }
                continue;
            }
            if (temp.length() == 2) {
                if (words.charAt(i) == temp.charAt(0)) {
                    continue;
                }
                temp.append(words.charAt(i));
            }
            if (temp.length() >= 3) {
                if (words.charAt(i) == temp.charAt(temp.length() - 1)) {
                    continue;
                }
                answer.append(temp);
                temp.setLength(0);
                temp.append(words.charAt(i));
            }
        }
        answer.append(temp);
        return answer.toString();
    }

附录

github上可以直接查看源代码以及测试用例:https://github.com/Carol0/Data-Structures-and-Algorithms/blob/main/dsa/src/main/java/com/carol/interview/bytedance/RepairSpell.java
B站上可以查看直播录制讲解视频:BV1Sg411H77Y

标签:面试题,窗口,charAt,temp,元素,2019,春招,words,append
From: https://www.cnblogs.com/lin0/p/16964653.html

相关文章

  • [BUUCTF][Web][GXYCTF2019]Ping Ping Ping 1
    打开靶机对应URL提示有ip参数尝试构造urlhttp://714ad4a2-64e2-452b-8ab9-a38df80dc584.node4.buuoj.cn:81/?ip=127.0.0.1显示/?ip=PING127.0.0.1(127.0.0.1):56......
  • [BUUCTF][Web][SUCTF 2019]EasySQL 1
    这一题有点蛋疼,比较难顶看了别人的writeup也很难get到解题思路,感觉必须要拿到源码进行审计才能解大佬们猜后端是这么写的select$_POST['query']||flagfromFlag;......
  • [BUUCTF][Web][极客大挑战 2019]Havefun 1
    打开靶机的URL,看到一个页面右键查看源代码,看到有用信息<html>...<!--$cat=$_GET['cat'];echo$cat;if($cat=='dog'){......
  • java高频面试题(反射、对象拷贝)
    java高频面试题(反射、对象拷贝)java高频面试题(反射、对象拷贝)1.什么是反射?反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力Java反射:在Java运行时环境......
  • [BUUCTF][Web][极客大挑战 2019]EasySQL 1
    打开靶机对应的url界面显示需要输入账号和密码分别在两个输入框尝试加单引号尝试是否有sql注入的可能,比如123'发现两个框可以注入,因为报了个错误信息Youhaveaner......
  • 分布式面试题
    0. 1.2.3. 分布式锁的几种实现方式分布式锁是控制分布式系统之间同步访问共享资源的一种方式。其典型的使用场景为:不同系统或者是同一系统的不同主机之间共享了一个或一......
  • Go常见面试题【由浅入深】2022版
    Go语言相比C++/Java等语言是优雅且简洁的,是笔者最喜爱的编程语言之一,它既保留了C++的高性能,又可以像Java,Python优雅的调用三方库和管理项目,同时还有接口,自动垃圾回收和goro......
  • ssm面试题
    Spring两大核心IoC控制反转和AOP面向切面编程什么是IoCSpring通过IoC容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期什么是AOP(和场景)将与业务无......
  • 多线程--面试题整理
    简述线程,程序、进程的基本概念线程:与进程相似,但线程是比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空......
  • 社招前端经典vue面试题汇总
    用过pinia吗?有什么优点?1.pinia是什么?在Vue3中,可以使用传统的Vuex来实现状态管理,也可以使用最新的pinia来实现状态管理,我们来看看官网如何解释pinia的:Pinia是Vue的......