2019.3.20 华为实习生机试题

第一题

题目描述

要开发一款教育类APP,帮助幼儿在识数阶段做一百以内自然数[0,99]的加减法。屏幕上会显示"0", “1”,“2”,“3”, “4”, “5”, “6”, “7”, “8”,“9”,"+","-","=“这些按钮,用户在按了若干按钮之后,如果按了”=",则会把"="之前的字符串作为一个算式,计算结果。中间结果或最后结果可以为负数。

输入描述

输入为一个字符串,形如"23+86-6+37+24-8-13"。
输入字符串中保证:

  1. 不会包含除"0", “1”,“2”,“3”, “4”, “5”, “6”, “7”, “8”,“9”,"+","-"之外的字符
  2. 长度不为0
  3. 不以"+“或者”-“开始;不以”+“或”-"结束
  4. 不会出现连续两个或者两个以上"+“或者”-"

输出描述

输出为算式的结果

AC代码

package com.csk.huawei;

import java.util.Scanner;
import java.util.Stack;

/**
 * Created by changsk on 2019/3/21
 */
public class Calc {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            String s = scanner.next();
            int res1 = calcMethod1(s);
            //int res2 = calcMethod2(s);
            System.out.println(res1);
            //System.out.println(res2);
        }
    }

    private static int calcMethod1(String s){
        Stack<Integer> stack = new Stack<>();
        int i = 0;
        char[] chars = s.toCharArray();
        int len = chars.length;
        int fuhao = -1;
        while(i < len){
            int num = 0;
            while(i < len && chars[i] <= '9' && chars[i] >= '0'){
                num = num * 10 + (chars[i] - '0');
                i++;
            }
            stack.push(num);
            if(stack.size() == 2){
                int n2 = stack.pop();
                int n1 = stack.pop();
                int res = 0;
                if(fuhao == 0) res = n1 - n2;
                else if(fuhao == 1) res = n1 + n2;
                stack.push(res);
                System.out.println(res);
            }
            if(i < len && chars[i] == '-') fuhao = 0;
            else if(i < len && chars[i] == '+') fuhao = 1;
            i++;
        }
        return stack.pop();
    }

    private static int calcMethod2(String s){
        int n1 = -1;
        int n2 = -1;
        char[] chars = s.toCharArray();
        int len = chars.length;
        int i = 0;
        boolean fuhao = false;
        while(i < len){
            int num = 0;
            while(i < len && chars[i] <= '9' && chars[i] >= '0'){
                num = num * 10 + (chars[i] - '0');
                i++;
            }
            if(n1 == -1) n1 = num;
            else n2 = num;
            if(n2 != -1){
                int res = 0;
                if(fuhao) res = n1 + n2;
                else res = n1 - n2;
                n1 = res;
            }
            if(i < len && chars[i] == '-') fuhao = false;
            else if(i < len && chars[i] == '+') fuhao = true;
            i++;
        }
        return n1;
    }
}

第二题

题目描述

输入一个字符串(不含空格),请寻找输入中包含的所有蛇形字符串。
蛇形字符串的定义:

  1. 蛇形字符串由连续字符对组成,其特点如下:
    1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小),如:Aa,Dd
    1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如:AaBbCc,OoPpRrSs
  2. 从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:
    2.1 每次寻找必须是最长的蛇形字符串
    2.2 使用过的字符串不能重复使用

输入描述

一个字符串(不含空格,字符串长度<= 5000)

输出描述

  1. 所有包含的蛇形字符串,按首字母升序排列(即A在Z前)
  2. 同一个首字母的情况,按照蛇形字符串长度降序输出
  3. 如果没有找到,输出Not Found

AC代码

package com.csk.huawei;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * Created by changsk on 2019/3/21
 */
//SxxsrR^AaSs
public class SnakeString {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            String s = scanner.next();
            snakeString(s);
        }
    }

    private static void snakeString(String s){
        List<String> list = new ArrayList<>();
        char[] chars = s.toCharArray();
        int[] lowerLetter = new int[26];
        int[] upperLetter = new int[26];
        for(int i = 0;i < chars.length;i++){
            if(chars[i] >= 'A' && chars[i] <= 'Z') upperLetter[chars[i] - 'A']++;
            if(chars[i] >= 'a' && chars[i] <= 'z') lowerLetter[chars[i] - 'a']++;
        }
        int pairs = 0; //大小写的对数
        for(int i = 0;i < lowerLetter.length;i++){
            int min = Math.min(lowerLetter[i], upperLetter[i]);
            upperLetter[i] = min;
            lowerLetter[i] = min;
            pairs += (min != 0) ? min : 0;
        }
        if(pairs == 0)
            System.out.println("Not Found");
        while(pairs != 0){
            int start = 0, len = 0, max = 0, st = 0;
            for(int i = 0;i < 26;i++){
                len = 0;
                if(upperLetter[i] != 0){
                    st = i;
                    i++;
                    len++;
                    while(i < 26 && upperLetter[i] != 0) {
                        len++;
                        i++;
                    }
                    if(len > max){
                        start = st;
                        max = len;
                    }
                }
            }
            StringBuilder sb = new StringBuilder();
            for(int i = start;i < start + max;i++){
                pairs--;
                sb.append((char)(i + 'A'));
                sb.append((char)(i + 'a'));
                //System.out.print((char)(i + 'A'));
                //System.out.print((char)(i + 'a'));
                lowerLetter[i]--;
                upperLetter[i]--;
            }
            list.add(sb.toString());
        }
        Collections.sort(list);
        for(String str : list)
            System.out.println(str);
    }
}

第三题

题目太长。。。

猜你喜欢

转载自blog.csdn.net/tkzc_csk/article/details/88716218
今日推荐