2017年華爲實習編程題

今天2017317日,華爲舉行實習生在線編程測試,老樣子,三道題,總共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”表示收集到第135個福,第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;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章