今天2017年3月17日,华为举行实习生在线编程测试,老样子,三道题,总共120分钟,花了我25分钟就搞定了,华为编程题目应该算很简单的了。
第一题:输入一个字符串,将字符串中的大写字母改为小写字母,小写字母不变,其他字符忽略,然后输出转换之后的结果,例如:
案例数 | 输入 | 输出 |
案例一 | AbCdEf | Abcdef |
案例二 | Aa1Bb2 | aabb |
解决方案:
1. 读取输入的字符串str
2. 将输入的字符串str转换为char数组arr
3. 对数组arr的每个字符判断是大写字母、小写字母还是其他字母
如果是大写字母,则通过arr[i] + ‘a’ - ’A’转换为小写字母
如果是小写字母,则无需转换
如果是其他字符,则忽视(不用添加到输出字符串中)
import java.util.*;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int delta = 'a' - 'A';
while (sc.hasNext()) {
String str = sc.next();
char[] arr = str.toCharArray();
StringBuffer buffer = new StringBuffer(arr.length);
for (int i = 0; i < arr.length; i++) {
if(arr[i] >= 'a' && arr[i] <= 'z'){
buffer.append(arr[i]);
} else if(arr[i] >= 'A' && arr[i] <= 'z'){
buffer.append((char)(arr[i] +delta));
}
}
System.out.println(buffer.toString());
}
sc.close();
}
}
第二题:集五福活动中,字符’1’代表收集到相应的福,例如”10101”表示收集到第1、3、5个福,第2和第4个福没有收集到。问:对于几个人收集到的福合在一起,能形成多少个五福呢?例如:
案例 | 输入 | 输出 |
案例一 | 10101 01010 11111 00000 | 2 |
解决方案:(使用最短木桶原则)
1. 输入结果集,并转成字符数组char[]
2. 设置数组int[] result = new int[5];其中每个值代表对应福的总数
3. 根据输入结果集循环遍历
如果是’1’,那么result[i]++,表示相应的福数量加一
如果是’0’,那么忽略
4. 最后返回result数组的最小值
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] result = new int[5];
while (sc.hasNext()) {
String str = sc.next();
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
if(arr[i] == '1'){
result[i]++;
}
}
}
int min = Integer.MAX_VALUE;
for(int i=0; i<5; i++){
if(min > result[i]){
min = result[i];
}
}
System.out.println(min);
}
}
第三题:计算后序表达式,输入后序表达式字符串,输出表达式计算的结果(其中A~F表示10~15)。例如:
案例 | 输入 |
| 输出 |
案例一 | 32+5- | 3+2-5 | 0 |
案例二 | A5-3+ | 10-5+3 | 4 |
解决方案:(采用栈)
1. 读取输入结果字符串str
2. 将输入字符串转换为字符数组char[]
3. 判断每个字符
如果是数字,则直接入栈:arr[i] - ‘0’
如果是大写字符,则转换之后入栈:arr[i] - ‘A’
如果是运算符号:则弹出两个数值栈,然后根据符号计算结果后入栈
import java.util.Scanner;
import java.util.Stack;
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String line = sc.next();
System.out.println(operate(line));
}
}
public static int operate(String str) {
char[] arr = str.toCharArray();
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
switch (c) {
case '+':
case '-':
case '*':
case '/':
Integer right = stack.pop();
Integer left = stack.pop();
switch (c) {
case '+':
stack.push(left + right);
break;
case '-':
stack.push(left - right);
break;
case '*':
stack.push(left * right);
break;
case '/':
stack.push(left / right);
break;
}
break;
default:
if(c >= 'A'){
stack.push(c - 'A' + 10);
} else {
stack.push(c - '0');
}
break;
}
if(i == str.length() - 1){
return stack.pop();
}
}
return -1;
}
}