2017年3月17日华为内推上机考试

刚刚考完上机来写一波自己的解答:

第一题

import java.util.Scanner;

/**
 * Created by Xavier on 2017/3/15.
 * 写出一个程序,输入一个字符串,然后输出大写转换为小写之后的字符串。不在字母范围内的字符,需丢弃
 *
 * 例如:  输入Abc  输出abc
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String line = sc.nextLine();
            StringBuilder newLine = new StringBuilder();
            for (int i = 0; i < line.length(); i++) {
                if (line.charAt(i) >= 'A' && line.charAt(i) <= 'Z') {
                    newLine.append((char) (line.charAt(i) + 32));
                } else if (line.charAt(i) >= 'a' && line.charAt(i) <= 'z') {
                    newLine.append(line.charAt(i));
                }
            }
            System.out.println(newLine.toString());
        }
    }
}

第二题

import java.util.Scanner;

/**
 * @author Xavier
 * @date 2017/3/17
 * 集五福作为近年来大家喜闻乐见迎新春活动,集合爱国福、富强福、和谐福、友善福、敬业福即可分享超大红包
 * 题目:以0和1组成的长度为5的字符串代表每个人所得到的福卡,每一位代表一种福卡,1表示已经获得该福卡
 * 单类型福卡不超过1张,随机抽取一个小于10人团队,求该团队最多可以集齐多少套五福
 *
 * 例如:输入11001 输出0
 */
public class Main {
    public static void main(final String[] args) {
        final Scanner sc = new Scanner(System.in);
        int sum = 0;
        while (sc.hasNext()) {
            final String line = sc.nextLine();
            sum += Integer.valueOf(line);
        }
        int min = 10;
        while (sum > 0) {
            final int tmp = sum % 10;
            min = tmp < min ? tmp : min;
            sum /= 10;
        }
        System.out.println(min);
    }
}

第三题

import java.util.Scanner;

/**
 * @author Xavier
 * @date 2017/3/17
 * 请您写一个postfixCalc函数,该函数根据输入的后缀表达式方式的字符串,输出计算的结果。
 * 例如,postfixAdd(32=5-")==0.
 */
public class Main {
    public static void main(final String[] args) {
        final Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            final String inputLine = sc.nextLine();
            final char[] input = inputLine.toCharArray();
            System.out.println(postfixCalc(input));
        }

    }

    private static int postfixCalc(final char[] input) {
        final String[] inputStr = new String[input.length];
        for (int i = 0; i < input.length; i++) {
            if (input[i] >= 'A' && input[i] <= 'F') {
                inputStr[i] = String.valueOf(input[i] - 'A' + 10);
                continue;
            }
            inputStr[i] = String.valueOf(input[i]);
        }
        for (int i = 0; i < input.length; i++) {
            if (input[i] >= '*' && input[i] <= '-') {
                cal(inputStr, i);
            }
        }
        return Integer.valueOf(inputStr[inputStr.length-1]);
    }

    private static void cal(final String[] input, final int n) {
        final int a;
        final int b;
        final String op = input[n];

        a = Integer.valueOf(input[n - 2]);
        b = Integer.valueOf(input[n - 1]);
        final int res;
        switch (op) {
        case "+":
            res = a + b;
            break;
        case "-":
            res = a - b;
            break;
        default:
            res = a * b;
            break;
        }

        input[n] = String.valueOf(res);
        for (int i = n - 1; i >= 2; i--) {
            input[i] = input[i - 2];
        }
    }
}

总的来说,题目不是很难
第一题的题干里说要弃掉非字母的部分,但是好像测试例子里面没有这样的情况,因为一开始我没有注意,后来检查的时候才发现,就加了上去

第二题就比较容易,没有什么好说的

第三题的话,主要是比较难理解这个“后缀表达式计算”,至少我之前是不知道的,就看着题目给的例子加上自己的猜测理解了一下,问了一下客服回答说自己想…
感觉这道题目的话,理解之后就也是和容易实现的,比较麻烦的部分就是char跟int类型的转换,后来写的时候发现一点问题就是如果直接用int算完转回char会发生越界,如果遇到乘法产生比较大的结果就不知道怎么存回去,于是就想着直接换成String数组来存储

你可能感兴趣的:(先分个大类以后再分吧)