华为2018实习生软件岗机试题目(2018.04.10)
程序员文章站
2022-04-04 20:12:49
...
刚刚做完笔试题目,题目具体内容记得不是很清楚了,请见谅。一共三道题目,时间120分钟。
第一题
题目描述
输入一行字符串(字母或者数字,可能含重复值),按照其ASCII码顺序输出。
比如:
输入
eeefffgghhk
次数统计
e —— 3次
f —— 3次
g ——2次
h —— 2次
k —— 1次
输出
efghkefghef
提交代码
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
char[] charArray = input.toCharArray();
//建立ASCII码数组,下标即对应的ASCII值
int[] asciiArray = new int[127];
//统计每个ASCII字符出现的次数
for (int i = 0; i < charArray.length; i++) {
asciiArray[charArray[i]]++;
}
StringBuilder sb = new StringBuilder();
//标记位 如果数组所有次数减为0,则退出循环
int zeroCount = 0;
while (zeroCount != 127) {
zeroCount = 0;
for (int j = 0; j < asciiArray.length; j++) { //循环遍历已经实现了按照ASCII值排序
if (asciiArray[j] != 0) {
char ch = (char) j; //拿到当前位的字符
sb.append(ch); //添加到输出
asciiArray[j]--; //次数减一
} else {
zeroCount++;
}
}
}
System.out.println(sb.toString());
}
}
第二题
题目描述
输入多行数字,第一行数字代表加下来要输入的数字个数。每个数字的值代表其可以向后跳跃的最长长度,求从第一位跳到最后一位的最短步数。
比如:
输入
7
2
3
2
1
2
1
5
得到
2 3 2 1 2 1 5
输出3
解析:最短路径为 2-2-2-5或者 2-3-2-5,都是跳3步到最后一位解题思路
一看就是用回溯算法
import java.util.*;
public class Main{
static int curStep = 0;
static int minStep = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int[] nums = new int[num];
for (int i = 0; i < num; i++)
nums[i] = scanner.nextInt();
jumpToLast(nums, 0);
System.out.println(minStep - 1);
}
private static void jumpToLast(int[] array, int curPosition) {
//超过
if (curPosition > array.length - 1) {
return;
}
//刚好
else if (curPosition == array.length - 1) {
curStep++; //向前
if (minStep == 0 || curStep < minStep)
minStep = curStep; //更新最小步数
curStep--; //回退
return;
}
//还没到尽头
else{
curStep++; //向前
for (int i = 1; i <= array[curPosition]; i++) {
jumpToLast(array,curPosition + i);
}
curStep--; //回退
}
}
}
第三题
题目描述
大整数(正数,位数不限)相乘,求乘积。输入两行字符串,输出乘积的字符串
比如:
输入
1234
4321
输出5332114
解题思路代码提交
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String num1 = scanner.nextLine();
String num2 = scanner.nextLine();
int len1 = num1.length();
int len2 = num2.length();
//新建一个数组用于存放结果,位数最多不超过totalLen
int totalLen = len1 + len2;
int[] resultArray = new int[totalLen];
//存放进位
int carry = 0;
//在数组中的存放位置移动指针(初始为最高位)
int index = totalLen - 1;
for (int i = len1 - 1; i >= 0; i--){
//遍历num1,从右侧(低位)开始
int tempNum1 = num1.charAt(i) - '0';
//遍历num2,每一位都与num1的当前位相乘
for (int j = len2 - 1; j >= 0; j--) {
int tempNum2 = num2.charAt(j) - '0';
//每一次算和的时候都要加上原来在该位置处的值以及进位
int sum = resultArray[i + j + 1] + tempNum1 * tempNum2 + carry;
//进位
carry = sum / 10;
//新值
resultArray[i + j + 1] = sum % 10;
}
//进位不为0,则需在数组中体现
if (carry != 0)
resultArray[i] = carry;
//进位清零
carry = 0;
}
StringBuilder sb = new StringBuilder();
if (resultArray[0] != 0)
sb.append(resultArray[0]);
for (int k = 1; k < totalLen; k++) {
sb.append(resultArray[k]);
}
System.out.println(sb.toString());
}
}
花了一个半小时写完,感觉还是有点紧张,当时做这道题的时候,【进位】和【新值】那边的/号和%号就写反了。不过很开心都做出来了~~~ 上一篇: java 在new一个新对象的时候内存中发生了什么
下一篇: css派生选择器怎么用