前言
本文主要是想记录一下华为机试刷题过程中的总结
牛客网的华为机试链接: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++;
}
}
}