【刷题记录⑩】Java工程师丨字节面试真题(四)

活动地址:CSDN21天学习挑战赛

Java面试练习题刷题记录

目录

一、水仙花数

二、万万没想到之聪明的编辑

三、万万没想到之抓捕孔连顺

总结


我几乎每天都会刷题训练来使自己对各种算法随时保持一个清晰的状态。要知道眼过千遍不如手过一遍,想成为一名合格的开发工程师,更要逼迫自己养成动手的好习惯。


我们都知道,算法的训练对程序员来说及其重要,语言和开发平台不断变化,但是万变不离其宗的是那些算法和理论,刷算法最最最直白的原因就是找一个好的工作,那刷题一定是必不可少的。

现在算法刷题平台还是蛮多的,给大家介绍一个我认为与大厂关联最深的平台——牛客网

2977e66c7847c01a01ced3302bba89cf.png

相较于其他平台,他们的题单更和工作,大厂靠拢,不光有面试必刷的101到题目,还有大量大厂真题,内容也全程免费,相较于其它会员费结算的来说 非常的友好。

df47799cc8780cb18e244fd0c0628ce2.png

牛客网还支持ACM模式,没有练习过的一定要提前适应!像某团、某为,都要求自己处理输入输出,如果不提前练习会很吃亏的!

牛客的题解更新迭代也很快,讨论区也有技巧的分享,能帮你把所有盲点扫清楚,整体来说还是非常推荐去练习的~

传送门: 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网


一、水仙花数

描述

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。

输入描述:

输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。

输出描述:

对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;如果给定的范围内不存在水仙花数,则输出no;每个测试实例的输出占一行。

示例1

输入:

100 120 
300 380

输出:

no
370 371

题解:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int m = sc.nextInt();
            int n = sc.nextInt();
            List res = new ArrayList<>();
            for(int i = m; i <= n; i++){        //遍历 m--n 范围内的数值
                int tmp = 0, stp = i, ans = 0;
                while(stp != 0){                // 判断当前取整后是否为0,不是则继续
                    // tmp 暂存当前数 i 除以10的余数(即从右开始取其位数)
                    tmp = stp % 10;
                    // stp 暂存当前数 i 除以10的整数(用于判断是否取余到最后一位)
                    stp /= 10;
                    // 计算每次所余数的位数的立方和
                    ans += tmp * tmp * tmp;
                }
                if(ans == i){        //如果立方和与当前数 i 相等,将其加入 res 数组中
                    res.add(i);
                }
            }
            if (res.isEmpty()){            //判断得到的 res 数组是否为空,为空输出 no
                System.out.println("no");
            }else {                        //不为空,则输出对应符合的水仙花数
                for (int index : res){
                    System.out.print(index + " ");
                }
                System.out.println();
            }
        }
    }
}

二、万万没想到之聪明的编辑

描述

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

1. 三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello

2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello

3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC

我特喵是个天才!我在蓝翔学过挖掘机和程序设计,按照这个原理写了一个自动校对器,工作效率从此起飞。用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!

……

万万没想到,我被开除了,临走时老板对我说: “做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。” 我现在整个人红红火火恍恍惚惚的……

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

数据范围: 1≤n≤50 1 \le n \le 50 \ 1≤n≤50  ,每个用例的字符串长度满足 1≤l≤1000 1 \le l \le 1000 \ 1≤l≤1000 

输入描述:

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

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

输出描述:

N行,每行包括一个被修复后的字符串。

示例1

输入:

2
helloo
wooooooow

输出:

hello
woow

示例2

输入:

1
nowcoder

输出:

nowcoder

题解:

import java.util.*;
import java.lang.*;
public class Main {
    public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        int n=reader.nextInt();
        String [] list=new String[n];
        for (int i=0;i deque=new LinkedList<>();
        int j=0;
        int pre=1;
        while (j=2&&pre==1) {
                deque.offerLast(chars[j]);
                sum++;
            }
            deque.offerLast(chars[j]);
            sum++;
            pre=sum;
            j++;
        }
        StringBuilder sb=new StringBuilder();
        int size=deque.size();
        for (int i=0;i

三、万万没想到之抓捕孔连顺

描述

我叫王大锤,是一名特工。我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺。和我一起行动的还有另外两名特工,我提议

1. 我们在字节跳动大街的 N 个建筑中选定 3 个埋伏地点。

2. 为了相互照应,我们决定相距最远的两名特工间的距离不超过 D 。

我特喵是个天才! 经过精密的计算,我们从X种可行的埋伏方案中选择了一种。这个方案万无一失,颤抖吧,孔连顺!

……

万万没想到,计划还是失败了,孔连顺化妆成小龙女,混在cosplay的队伍中逃出了字节跳动大街。只怪他的伪装太成功了,就是杨过本人来了也发现不了的!

请听题:给定 N(可选作为埋伏点的建筑物数)、 D(相距最远的两名特工间的距离的最大值)以及可选建筑的坐标,计算在这次行动中,大锤的小队有多少种埋伏选择。

注意:

1. 两个特工不能埋伏在同一地点

2. 三个特工是等价的:即同样的位置组合( A , B , C ) 只算一种埋伏方法,不能因“特工之间互换位置”而重复使用

数据范围: 0

输入描述:

第一行包含空格分隔的两个数字 N和D(1 ≤ N ≤ 1000000; 1 ≤ D ≤ 1000000)

第二行包含N个建筑物的的位置,每个位置用一个整数(取值区间为[0, 1000000])表示,从小到大排列(将字节跳动大街看做一条数轴)

输出描述:

一个数字,表示不同埋伏方案的数量。结果可能溢出,请对 99997867 取模

示例1

输入:

4 3
1 2 3 4

输出:

4

说明:

可选方案 (1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)   

示例2

输入:

5 19
1 10 20 30 50

输出:

1

说明:

可选方案 (1, 10, 20)   

示例3

输入:

2 100
1 102

输出:

0

说明:

无可选方案  

题解:

import java.util.*;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int d = sc.nextInt();
            int[] locations = new int[n];
            for (int i = 0; i < n; i++) {
                locations[i] = sc.nextInt();
            }
            
            long count = dsp(locations, n, d);
            
            System.out.println(count);
        }
    }
    
    public static long dsp(int[] locations, int n, int d) {
        int left = 0, right = 2;
        long count = 0;
        
        int mod = 99997867;
        while (right < n) {
            if (locations[right] - locations[left] > d) 
                left++;
            else if (right - left < 2) 
                right++;
            else {
                long num = right - left;   // 第二位和第三位之间的最远距离
                count += num * (num - 1) / 2L; // 第二位和第三位可以排列组合的数量
                right++;
            }
        }
        
        count %= mod;
        return count;
    }
}

总结

点击链接 进行跳转注册,开始你的保姆级刷题之路吧!

另外这里不仅仅可以刷题,你想要的这里都会有,十分适合小白和初学者入门学习~
1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单
2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等
3、语言篇(500题):C/C++、java、python入门算法练习
4、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题
5、大厂笔试真题:字节跳动、美团、百度、腾讯…掌握经验不在惧怕面试!
 

7cc054e25bd74ac5ac50a80eeaa75007.png



【刷题记录⑩】Java工程师丨字节面试真题(四)_第1张图片

你可能感兴趣的