牛客网:华为机试刷题记录

本文记录了华为机试中的五道编程题,涉及位操作计算正整数1的个数,使用位图统计字符,利用TreeMap合并表记录,正则匹配处理坐标移动,以及用正则表达式进行错误记录。每道题都突显了特定的算法和数据结构的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文主要是想记录一下华为机试刷题过程中的总结
牛客网的华为机试链接:https://www.nowcoder.com/exam/oj/ta?tpId=37


一、HJ15 求int型正整数在内存中存储时1的个数

在这里插入图片描述
在这里插入图片描述

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int count = 0;
        while(n > 0){
            n = n&(n-1);
            count++;
        }
        System.out.println(count);
    }
}

二、HJ10 字符个数统计

凡是涉及到去重统计都可以用位图实现。因为每一个不同的数据只需要用二进制的一位存储即可,大大减小了统计所使用的存储空间

import java.util.Scanner;
import java.util.BitSet;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.next();
        //总共有128个字符。字需要用128位
        BitSet bitSet = new BitSet(128);
        for (char c : line.toCharArray()) {
            //判断字符c是否已出现
            if (!bitSet.get(c)) {
                //未出现就设置为已出现
                bitSet.set(c);
            }
        }
        //统计有多少字符已出现过
        System.out.println(bitSet.cardinality());
    }
}

三、HJ8 合并表记录

关键点:TreeMap,保证 key 的有序


import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        Map<Integer,Integer> res = new TreeMap<>();

        int i = 0;
        // 注意 hasNext 和 hasNextLine 的区别
        while (i < n) { // 注意 while 处理多个 case
            i++;
            int a = in.nextInt();
            int b = in.nextInt();
            if(res.containsKey(a)){
                res.put(a,res.get(a)+b);
            }else{
                res.put(a,b);
            }
        }
        for(Integer key : res.keySet()){
            System.out.println(key +" "+ res.get(key));
        }
    }
}

四、HJ17 坐标移动

关键点:正则匹配,对数据进行过滤

import java.util.*;
import java.io.*;
 
public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] in = bf.readLine().split(";");
        int x = 0;
        int y = 0;
        for(String s : in){
            // 不满足题目给定坐标规则
            if(!s.matches("[WASD][0-9]{1,2}")){
                continue;
            }
            int val = Integer.valueOf(s.substring(1));
            switch(s.charAt(0)){
                case 'W':
                    y += val;
                    break;
                case 'S':
                    y -= val;
                    break;
                case 'A':
                    x -= val;
                    break;
                case 'D':
                    x += val;
                    break;
            }
        }
        System.out.println(x+","+y);
    }
}

五、HJ19 简单错误记录

正则表达式分析链接Java正则表达式

关键点:String[] bbb = aaa.split(“\\”);

使用split来切分字符串时,遇到以反斜杠\作为切分的字符串,split后传入的内容是\\,这么写是因为第一和第三是个斜杠是字符串的转义符。转义后的结果是\,split函数解析的不是字符串而是正则,正则表达式中的\结果对应\,所以分隔反斜杠的时候要写四个反斜杠。

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        Map<String,Integer> map = new LinkedHashMap();
        String tstr = null;
        while((tstr = bf.readLine()) != null && !tstr.equals("")){
            String[] str = tstr.split("\\s+");
            String fname=str[0].substring(str[0].lastIndexOf("\\") + 1);
            fname = fname.substring(Math.max(fname.length()-16 ,0))+" "+str[1];
            Integer tmp = map.get(fname);
            if(tmp == null)
                map.put(fname,1);
            else
                map.put(fname, tmp+1);
        }
        int count = 0;
        for(Map.Entry<String,Integer> it : map.entrySet()){
            if(map.size() - count <= 8)
                System.out.println(it.getKey()+" "+it.getValue());
            count++;
        }
    }
}
### 如何通过牛客网进行题以准备华为OD岗位 #### 准备阶段 为了更好地应对华为OD岗位的,建议从以下几个方面入手。首先,选择合适的编程语言至关重要。根据经验分享,如果刚开始接触算法和数据结构,可以选择 Java 作为入门语言[^3]。然而,在多次尝后发现 Python 更加适合快速开发以及解决实际问题的情况下,切换至 Python 是明智的选择。 #### 平台特点对比 相比其他在线练习网站如 LeetCode 或者力扣(国内版),牛客网对于备考华为 OD 考具有明显优势。其主要原因在于: - **清晰度更高的题目描述**:相较于某些平台上可能存在模糊不清或者过于简化的解释,牛客网提供了更为详尽的任务背景说明。 - **灵活性更强的测环境**:允许用户自由定义输入输出参数,并支持多种运行模式下的即时反馈功能。 - **贴近真实考核形式的设计理念**:由于华为官方采用相同的技术框架来进行候选人评估活动,因此熟悉该系统的操作逻辑有助于提升实战表现水平[^1]。 #### 实践技巧总结 以下是几个具体有效的学习路径指南: ##### HJ系列经典习题解析 | 序号 | 名称 | 描述 | |------|--------------------------|----------------------------------------------------------------------------------------| | 1 | `HJ15` | 统计给定范围内所有整数值对应的二进制表达式中含有多少个'1'[^4]. | | 2 | `HJ10`字符个数统计 | 记字符串里各个字母出现频率并按字典序排列显示结果[^4]. | | 3 | `HJ8`合并表记 | 将两个已排序数组整合成一个新的有序列表. | | 4 | `HJ17`坐标移动 | 根据指定方向调整当前位置坐标值. | | 5 | `HJ19`简单错误记 | 找出程序执行过程中产生的异常信息片段. | 这些基础训练项目可以帮助初学者逐步建立起扎实的知识体系架构,同时也能锻炼解决问题的能力。 ```python def count_ones(n): """计算n转化为二进制后的‘1’数量""" return bin(int(n)).count('1') if __name__ == "__main__": import sys nums = [] n = int(sys.stdin.readline().strip()) for _ in range(n): num = sys.stdin.readline().strip() ones_count = count_ones(num) print(ones_count) ``` 上述代码展示了如何处理多组测案例中的每一个单独数字转换为其二进制表示法之后所含有的 '1' 的总数目[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值