202003华为面经

1. 机试,耗时120分钟

1.1 将字母排序,非字母用#代替

输入:independent
输出:ddeeeinnnpt

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input = in.next();

        char[] chars = input.toCharArray();

        for (int i = 0; i < chars.length - 1; i++) {
            for (int j = 0; j < chars.length - 1 - i; j++) {
                if (chars[j] > chars[j + 1]) {
                    char temp = chars[j];
                    chars[j] = chars[j + 1];
                    chars[j + 1] = temp;
                }
            }
        }

        System.out.print('#');

        for (int i = 0; i < chars.length; i++) {
            if ((chars[i] >= 'a' && chars[i] <= 'z')
                    || (chars[i] >= 'A' && chars[i] <= 'Z')) {

                System.out.print(chars[i]);
            }else {
                System.out.print('#');
            }
        }
    }
}

1.2 将字母倒置,其余字符的位置不变

输入:Test1ng-Leet=code-Q!
输出:Qedo1ct-eeLg=ntse-T!

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input = in.next();
        int length = input.length();

        char[] chars = input.toCharArray();


        List<Character> characterList = new ArrayList<>();
        Map<Integer, Character> specials = new HashMap<>();
        for (int i = 0; i < chars.length ; i++) {
            if ((chars[i] >= 'a' && chars[i] <= 'z')
                    || (chars[i] >= 'A' && chars[i] <= 'Z')) {
                characterList.add(chars[i]);
            } else {
                specials.put(i, chars[i]);
            }
        }

        int charLength = characterList.size();
        for (int i = 0; i < length; i++) {
            if (specials.containsKey(i)) {
                System.out.print(specials.get(i));
            } else {
                System.out.print(characterList.get(--charLength));
            }
        }

    }
}

1.3 每次可以爬1或2个台阶,有多少种方法可以爬n层楼

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int input = in.nextInt();

        System.out.println(compute(input));

    }

    private static int compute(int n) {
        if (n <= 2) {
            return n;
        } else {
            return compute(n - 1) + compute(n - 2) ;
        }
    }

}

2. 一面,电话,耗时34分钟

2.1 复盘机试题

  1. 冒泡排序:
    如果数据本来就是有序的,需要比较多少次?移动多少次?最好情况下的时间复杂度是多少?
    如果是完全倒序的,需要比较多少次?移动多少次?最坏情况下的时间复杂度是多少?
    平均情况下的时间复杂度?

  2. 略过

  3. 斐波那契数列
    做机试的时候要考虑边界值问题

2.2 面试题

  • Java中的基本数据类型?int占用多少个字节?表示的数值范围?
    (-2)的31次方 ~ (2的31次方) - 1

  • 栈和队列的共同点和差异?
    共同点:都是只允许在端点处插入和删除元素的数据结构;
    不同点:栈是仅在栈顶进行访问,遵循后进先出的原则(LIFO);队列是在队尾插入数据,在队头删除数据(FIFO)

  • 进程和线程之间的区别?线程模型?进程间是如何通信的?

  • TCP和UDP的区别?
    (1) tcp是面向连接的,udp是面向无连接的
    tcp在通信之前必须通过三次握手机制与对方建立连接,而udp通信不必与对方建立连接,不管对方的状态就直接把数据发送给对方
    (2) tcp连接过程耗时,udp不耗时
    (3) tcp连接过程中出现的延时增加了被攻击的可能,安全性不高,而udp不需要连接,安全性较高
    (4) tcp是可靠的,保证数据传输的正确性,不易丢包,udp是不可靠的,易丢包
    tcp可靠的四大手段:
    顺序编号:tcp在传输文件的时候,会将文件拆分为多个tcp数据包,每个装满的数据包大小大约在1k左右,tcp协议为保证可靠传输,会将这些数据包顺序编号
    确认机制:当数据包成功的被发送方发送给接收方,接收方会根据tcp协议反馈给发送方一个成功接收的ACK信号,信号中包含了当前包的序号
    超时重传:当发送方发送数据包给接收方时,会为每一个数据包设置一个定时器,当在设定的时间内,发送方仍没有收到接收方的ACK信号,会再次发送该数据包,直到收到接收方的ACK信号或者连接已断开
    校验信息:tcp首部校验信息较多,udp首部校验信息较少
    (5) tcp传输速率较慢,实时性差,udp传输速率较快
    tcp建立连接需要耗时,并且tcp首部信息太多,每次传输的有用信息较少,实时性差
    (6) tcp是流模式,udp是数据包模式
    tcp只要不超过缓冲区的大小就可以连续发送数据到缓冲区上,接收端只要缓冲区上有数据就可以读取,可以一次读取多个数据包,而udp一次只能读取一个数据包,数据包之间独立

  • 7层网络通信模型?

  • http和https的区别?密钥从哪来的,http证书,双向认证过程?http 对称加密和非对称加密?
    HTTPS和HTTP的区别主要如下:
    (1) https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
    (2) http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
    (3) http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    (4) http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
    
    证书认证过程参考:单向认证与双向认证

  • GET和POST的区别,安全方面有什么区别?
    (1) GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
    (2) GET书签可收藏,POST为书签不可收藏。
    (3) GET能被缓存,POST不能缓存 。
    (4) GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
    (5) GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
    (6) GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。POST无限制。
    (7) GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
    (8) 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
    (9) GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。

  • static 和 非static 内部类的区别?
    (1) 是否能拥有静态成员
    静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
    (2) 访问外部类的成员
    静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
    (3) 静态内部类和非静态内部类在创建时有区别
    //假设类A有静态内部类B和非静态内部类C,创建B和C的区别为

A a = new A(); 
A.B b = new A.B(); 
A.C c = a.new C();
  • 反射中的Method ,JDK的源码实现?

  • Java中为什么需要序列化?
    对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口 。

  • 数据库事务的原理?
    参考:数据库事务原理

  • UML图中组合关系和聚合关系?
    (1) 依赖
    虚线箭头
    类A的某个成员函数的返回值、形参、局部变量或静态方法的调用,则表示类A引用了类B。
    (2) 关联
    实线箭头
    类之间的关系比依赖要强
    (3) 聚合
    实线加空心菱形
    表示集体与个体之间的关联关系
    (4) 组合
    实线加实心菱形
    表示个体与组成部分之间的关联关系
    (5) 泛化
    直线加空心三角形
    类与类之间的继承关系和类与接口之间的实现关系

  • 编程题:写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
 
public class Main{
 
    public static void main(String[] args) throws Exception {
         String fileName = "aaa.txt";
        String str = "ab";
        int num = Count(fileName, str);
        System.out.println(num);
    }
     
    public static int Count(String  fileName , String str) throws Exception{
        //获取文件中的字符
        FileReader fr = new FileReader(new File(fileName));
        BufferedReader br = new BufferedReader(fr);
        StringBuffer sb = new StringBuffer();
        String line;
        while((line = br.readLine()) != null ){
            sb.append(line);
        }
        String filestr = sb.toString();  //文件中的字符
        System.out.println(filestr);
        //统计这个字符串在这个文件中出现的次数
         
        int num = 0;
        while(filestr.length() > str.length()){
            int index  = filestr.indexOf(str);
            if(index>-1){             //存在字符串str
                num++;
                filestr = filestr.substring(index+str.length());
            }
            else{
                break;
            }
             
        }
        return num;
    }
}

3. 二面,电话,耗时31分钟

  • Calcite解析sql具体是怎么做的?

  • 实时计算的吞吐量?实时接入项目的采集代理的实现,binlog读取的相关工具,采集数据用的传输协议,大概流量是多少,设计容量是多少?

设计容量:多少任务需要配置多少机器资源

  • kafka客户端消费数据,客户端宕机,如何保证exactly-once?kafka是如何管理消费位置的?

  • Kafka的topic数变多的时候,性能会降低,从源码角度讲下原因?有什么解决办法?与Pulsar的区别?

磁盘目录过多。增加kafka的broker机器

  • 建议每个topic创建的分区大小?如果有50台机器,根据经验应该创建多少?

  • HBase API,基于HBase的SQL引擎?
    Phoneix

  • OpenTsdb这种时序数据库和普通数据库之间的区别?SQL语法差异

  • 数据库死锁的原因,减少死锁的方法?

  • SparkStreaming和StructuredStreaming的区别?

  • Flink中的窗口算子有哪些,应用场景?

  • web系统界面打开非常慢,排查思路?
    网络问题,sql查询分页,加一层缓存。服务端进程CPU、内存等问题

  • 编程题:m n 求最大公约数,考虑效率问题
    辗转相除法

public class Test {
	public static void main(String[] args) {
		int a = 12;
		int b = 9;
		int result = mod(a, b);
		System.out.println(result);
	}
	
	static int mod(int a,int b){
		if(a%b == 0){
			return b;
		}else{
			return mod(b,a%b);
		}
	}

最小公倍数,就是两数乘积除以最大公约数。

4. 资格面,视频,耗时25分钟

HR面,主要沟通下薪资情况。

5. 综合面,视频,耗时30分钟

boss面,主要问做过的项目,以及对产品的理解等。

原创文章 25 获赞 22 访问量 1251

猜你喜欢

转载自blog.csdn.net/a1240466196/article/details/105449320
今日推荐