今天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;
}
}