当前位置:   article > 正文

【华为OD】_一个设备由 n 种元器件组成(每种类型元器件只需要一个,累心 type 编号从 0~n~1),

一个设备由 n 种元器件组成(每种类型元器件只需要一个,累心 type 编号从 0~n~1),

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
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

第二题

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

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

b,数字之间相邻4空格

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

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

输入:2

输出:
XXXX1****
3****XXXX2****
  • 1
  • 2
  • 3
  • 4
  • 5

思路:

每行按照奇偶来确定排列顺序,然后让一个变量一直递增,第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<
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/523313
推荐阅读
相关标签
  

闽ICP备14008679号