最近华为2019届的应届毕业生招聘工作也如火如荼的开始了,既然众多小伙伴们都想要试一试,那么笔试这一关肯定是要过的了,那么本次我们就来简单分享一下华为研发工程师的三道编程题。需要提前说明的一个小问题是:在进行Scanner输入时,需要使用while(scanner.hasNext()){}来判断是否后续还有输入,否则在系统中无法通过测试。
[编程题] 汽水瓶
时间限制:1秒
空间限制:32768K
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入描述:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
输入例子1:
3 10 81 0
输出例子1:
1 5 40思路解析:
拿到这个题,首先我们可以先进行找规律。
空瓶数量 可以喝的汽水数量
1 0
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 4
10 5
... ...
通过找规律,我们可以发现,我们首先都计算我们的空瓶可以换几瓶汽水。此时我们设空瓶数量为count,剩余的空瓶数量为lastNum。我们可以用空瓶换得的汽水数量为count/3瓶,那么此时剩余lastNum = count/3 + count%3个空瓶。反复计算此时可以换得的汽水数量和剩余的空瓶数量,当此时可以换得的空瓶数量为0时,即count/3 = 0时,停止计算。此时需要单独判断lastNum是否为2,若为2,则向店老板借一瓶还可以再换得一瓶汽水。
有了上面的思路,写出代码自然也就没有那么难了。参考代码如下所示。
import java.util.Scanner;
/**
*
* @author LXH
*
*/
public class Bottom {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = 0;
while(scanner.hasNext()) {
count = scanner.nextInt();
int result = 0;
int num = count / 3;
int lastNum = count;
while(num != 0) {
result += num;
lastNum = num + lastNum%3;
num = lastNum / 3;
}
if(lastNum == 2) {
result += 1;
}
System.out.println(result);
}
scanner.close();
}
}
[编程题] 明明的随机数
时间限制:1秒
空间限制:32768K
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
Input Param
n 输入随机数的个数
inputArray n个随机整数组成的数组
Return Value
OutputArray 输出处理后的随机整数
注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。
输入描述:
输入多行,先输入随机整数的个数,再输入相应个数的整数
输出描述:
返回多行,处理后的结果
输入例子1:
11 10 20 40 32 67 40 20 89 300 400 15
输出例子1:
10 15 20 32 40 67 89 300 400
本题总体来说并不难,完成去重和排序工作。去重可以使用List的contains方法或者使用一个大小为1000的数组来辅助,排序可以使用Java中Collections提供的sort方法来完成排序工作。但是需要注意的问题同样是输入问题:在进行Scanner输入时,需要使用while(scanner.hasNext()){}来判断是否后续还有输入,否则在系统中无法通过测试。
参考代码如下所示。
import java.util.Scanner;
/**
* 因为随机数的范围为0~1000,所以只需要申请一个1000个元素大小的数组即可。
* 每一次将输入数字的哪一个下标的元素置1,最后遍历一遍数组,完成输出。
* @author LXH
*
*/
public class Num {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt()) {
int num = scanner.nextInt();
int[] data = new int[1000];
for(int i = 0; i < 1000; i++) {
data[i] = 0;
}
for(int i = 0; i < num; i++) {
data[scanner.nextInt()] = 1;
}
for(int i = 0; i < data.length; i++) {
if(data[i] != 0) {
System.out.println(i);
}
}
}
scanner.close();
}
}
[编程题] 进制转换
时间限制:1秒
空间限制:32768K
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
输入例子1:
0xA
输出例子1:
10
本次需要将十六进制数字转换为十进制数字,只需要使用公式result = resulut*16+当前位置数字,即可完成转换。参考代码如下所示。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Sixteen {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Map<Character, Integer> map = new HashMap<>();
map.put('0', 0);
map.put('1', 1);
map.put('2', 2);
map.put('3', 3);
map.put('4', 4);
map.put('5', 5);
map.put('6', 6);
map.put('7', 7);
map.put('8', 8);
map.put('9', 9);
map.put('A', 10);
map.put('B', 11);
map.put('C', 12);
map.put('D', 13);
map.put('E', 14);
map.put('F', 15);
while(scanner.hasNext()) {
String s = scanner.next();
s = s.substring(2);
long result = 0;
for(int i = 0; i < s.length(); i++) {
result = (result * 16 + map.get(s.charAt(i)));
}
System.out.println(result);
}
scanner.close();
}
}
总体来说这一套研发工程师的题目还是非常简单的,大家可以作为参考,如果有更好的解题方法,可以私信博主哦。