【华为OD】

本文详述了作者在华为OD职位的面试过程,包括机试的三道算法题详解,以及技术面试中涉及的Java基础知识、数据结构、数据库操作、Redis、JVM、线程池、Spring注解、设计模式等知识点。面试还讨论了项目经验、线上问题排查以及解决方案。
摘要由CSDN通过智能技术生成

1,机试

第一题:

停车场有一横排车位,0代表没有停车,1代表有车,至少停了一辆车在车位上,也至少有一个空位没有停车。

为了放剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此时的最大距离。

输入描述:一个字符串,半角逗号隔开

输出描述:输出一个整数记录最大距离

思路:

遍历数组,对于是0的位置,代表可以停车,从这个位置往左右两边找到的第一个是1的位置,取两边的最小值,特殊处理一下第一个位置和最后一个位置是0的情况就行。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
   
    public static void main(String[] args) {
   
        Scanner cin = new Scanner(System.in);
        // 将输入的字符串拆分、转换放入整数数组中
        int[] g = Arrays.stream(cin.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
        int n = g.length; // 数组长度
        int res = -1;  //返回结果,默认-1

        // 遍历数组
        for (int i = 0; i < n; ++i) {
   
            if (g[i] == 1) {
   
                // 当前位置为1,进入下一次循环
                continue;
            } else {
   
                // 否则,找到数字为0的最长连续区间,以i为中心向左右扩展
                int l = i, r = i;
                while (l >= 0 && g[l] != 1) {
   
                    l--; // 向左扩展
                }
                while (r < n && g[r] != 1) {
   
                    r++; // 向右扩展
                }
                int left = i - l;  // 左边长度
                int right = r - i; // 右边长度
                if (l==-1 && i==0){
   
                    // 如果左边没有1,只需要更新右边0区间长度
                    res = Math.max(res, right);
                }else if (r==n&&i==n-1){
   
                    // 如果右边没有1,只需要更新左边0区间长度
                    res = Math.max(res, left);
                }else {
   
                    // 否则,更新左右两边的最小区间长度
                    res = Math.max(res, Math.min(left, right));
                }
            }
        }
        System.out.println(res);
    }
}
/*
1. 从输入中读取一行字符串,并使用空格分隔,将每个字符转换为整数,存储在数组`g`中。
2. 定义整数`n`,表示数组`g`的长度。
3. 定义整数`res`,用于记录最终结果,默认为-1。
4. 使用循环遍历数组`g`,对每个元素进行判断。
5. 如果当前元素为1,则跳过继续下一次循环,因为要找的是连续0区间。
6. 否则,以当前位置`i`为中心,向左右两边扩展,找到最长的连续0区间。
7. 分别计算左边和右边的连续0区间长度,分别为`left`和`right`。
8. 根据情况更新最长连续0区间的长度`res`。如果左边没有1,则只更新右边的0区间长度;如果右边没有1,则只更新左边的0区间长度;否则,更新左右两边的最小0区间长度。
9. 最后输出最长连续0区间的长度`res`。
* */

第二题

小华是一个很有数字很敏感的小朋友,他觉得数字的不同排列方式有特别美感。某天,小华突发奇想,如果数字多行排列,第一行1个数,第二行2个,第三行3个,即第n行有n个数字,并且奇数行正序排列,偶数行逆序排序,数字依次累加,这样排列的数字一定很有意思,聪明的你能编写代码帮助小华完成这个想法吗?

a,每个数字占据4个位置,不足四位用补位,如1打印为1 * ***

b,数字之间相邻4空格

c,数字打印顺序正反交替,奇数行正序,偶数行逆序

d,最后一行数字定格,第n-1行相对第n行缩进四个空格

输入:2

输出:
XXXX1****
3****XXXX2****

思路:

每行按照奇偶来确定排列顺序,然后让一个变量一直递增,第i行就是有i个数字,每个数字补齐到长度为4,然后对于每行,前面要加 n-i 个四个空格

import java.util.Scanner;
import java.util.StringJoiner;

public class Main2 {
   
    public static void main(String[] args) {
   
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt(); // 记录输出的行数
        int cnt = 1; // 计数器,用于填充数组元素

        // 外层循环,控制输出的行数
        for (int i = 1; i <= n; i++) {
   
            int[] list = new int[i]; // 长度为i的数组

            // 内层循环,填充数组元素
            for<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值