华为研发工程师编程题分享

5 篇文章 0 订阅

最近华为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();
	}
}

    

        总体来说这一套研发工程师的题目还是非常简单的,大家可以作为参考,如果有更好的解题方法,可以私信博主哦。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值