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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值