首页 > 2021/6/19 华为OD机考
头像
406穷光蛋
编辑于 2021-06-22 22:52
+ 关注

2021/6/19 华为OD机考

浏览器一定只能保留机考那一个页面!
浏览器一定只能保留机考那一个页面!!
浏览器一定只能保留机考那一个页面!!!

第一题

很简单的一道题,输入一个整型数组,找出其中出现次数超过一半以上的元素,输出该元素。

比如:

输入:

1,5,9,5,5,4,8,5,5

输出:

5

第二题 求最后一个单词的长度

也是一道简单题,输入一个字符串,字符串仅由字母和空格组成,空格隔开的就是单词,求最后一个单词的长度。比如

输入:

hello world

输出:

5

第三题 比较两个版本号的大小

在 leetcode 上有类似的题:165. 比较版本号

输入两个版本号 version1 和 version2,每个版本号由多个子版本号组成。子版本号之间由 “.” 隔开,由大小写字母、数字组成,并且至少有一个字符。

按从左到右的顺序比较子版本号,比较规则如下:

  • 子版本号前面的0不参与比较,比如 0011 是相等的。
  • 小写字母 > 大写字母 > 数字
  • 空字符和0相等,比如 11.0 相等

比较结果:

  • 如果 version1 > version2 ,返回 1
  • 如果 version1 < version2 ,返回-1
  • 其他情况返回0

实例1:

输入:
5.2
5.1a

输出:
1

实例2:

输入:
5.6.1
5.6.2a

输出:
-1

实例3:

输入:
5.6.8.a
5.6.8.0a

输出:
0

需要注意的坑:

  • str,split("\\.") ,记得要转义分隔符
  • 两个版本号的子版本号数量可能不一样
  • 子版本号长度不一样

我的代码实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 输入数据
        Scanner in = new Scanner(System.in);
        String v1 = in.next();
        String v2 = in.next();

        // 去掉连接符
        String[] arr1 = v1.split("\\.");
        String[] arr2 = v2.split("\\.");

        int len1 = arr1.length;
        int len2 = arr2.length;;


        // 两两比较
        for(int i=0; i<len1 && i<len2; i++){
            int res = helper(arr1[i], arr2[i]);
            if(res != 0) {
                System.out.println(res);
                return;
            }
        }

        // arr1 长
        if(len1 > len2){
            int k = len2;
            while(k < len1){
                int res = helper(arr1[k],"");
                if(res != 0) {
                    System.out.println(res);
                    return;
                }
                k++;
            }
            System.out.println(0);
            return;
        }

        // arr2 长
        if(len2 > len1){
            int k = len1;
            while(k < len2){
                int res = helper("",arr2[k]);
                if(res != 0) {
                    System.out.println(res);
                    return;
                }
                k++;
            }
            System.out.println(0);
            return;
        }

        System.out.println(0);
    }


    // 比较两个字版本号的大小
    public static int helper(String v1, String v2){
        // 1. 先删除子版本号前面的0
        StringBuilder sb1 = new StringBuilder(v1);
        while(sb1.length() > 0 && sb1.charAt(0) == '0'){
            sb1.deleteCharAt(0);
        }

        StringBuilder sb2 = new StringBuilder(v2);
        while(sb2.length() > 0 && sb2.charAt(0) == '0'){
            sb2.deleteCharAt(0);
        }

        // 2. 逐个字符比较
        for(int i=0; i<sb1.length() && i<sb2.length(); i++){
            if(sb1.charAt(i) > sb2.charAt(i)) return 1;
            else if(sb1.charAt(i) < sb2.charAt(i)) return -1;
        }

        // 3. sb1 更长
        int len1 = sb1.length();
        int len2 = sb2.length();
        if(len1 > len2) {
            int k = len2;
            while(k<len1){
                if(sb1.charAt(k) > '0') return 1;
                k++;
            }
            return 0;
        }

        // sb2 更长
        if(len2 > len1) {
            int k = len1;
            while(k<len2){
                if(sb2.charAt(k) > '0') return -1;
                k++;
            }
            return 0;
        }

        return 0;
    }
}

全部评论

(8) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐