Skip to content

Latest commit

 

History

History
171 lines (142 loc) · 4.29 KB

华为笔试.md

File metadata and controls

171 lines (142 loc) · 4.29 KB

终于AC一道华为笔试了(手动哭泣)

题目描述:给定一个字符串,形如“1#3+1#0.4”,特殊字符有对应固定计算公式,其余与正常数学计算无异,返回计算结果。

字符串中包含!,@,#三种特殊字符,规定:

  1. !+!=0
  2. !+@=13
  3. !+#=4
  4. @+@=7
  5. @+#=20
  6. #+#=10

上述算式都满足交换率,算式中特殊字符成对出现,小数点不算特殊字符。

例如:1#3+1#0.4

输出:303.4

解析:原型其实是数字字符串(带小数位)加法,对于特殊字符,加一个函数收集特殊规定就可以了。有几个要点:

  • 小数位补零
  • 整数位前补零
  • 模拟加法运算

实现代码

import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int len = sc.nextInt();
        String s = sc.next();
        String[] str = s.split("\\+");

        if (str[0].length() == 0 && str[1].length() != 0) {
            System.out.println(str[1].toString());
            return;
        }
        if (str[0].length() != 0 && str[1].length() == 0) {
            System.out.println(str[0].toString());
            return;
        }
        if (str[0].length() == 0 && str[1].length() == 0) {
            System.out.println();
            return;
        }

        // 为小数位补零
        int aLen = 0;
        int bLen = 0;
        String a = "";
        String b = "";
        if (str[0].contains(".")) {
            String[] aArr = str[0].split(".");
            aLen = aArr[1].length(); 
            a = aArr[0] + aArr[1];//除去小数点后的字符串
        } else {
            aLen = 0;
            a = str[0];
        }

        if (str[1].contains(".")) {
            String[] bArr = str[1].split("\\.");
            bLen = bArr[1].length();
            b = bArr[0] + bArr[1];
        } else {
            bLen = 0;
            b = str[1];
        }

        int maxLen = Math.max(aLen, bLen);//小数为的最大长度

        for (int i = 0; i < maxLen - aLen; i++) {
            a += "0";
        }

        for (int i = 0; i < maxLen - bLen; i++) {
            b += "0";
        }

       //前补零
        int lenMax = Math.max(a.length(), b.length());//总的最大长度
        int lenMin = Math.min(a.length(), b.length());//总的最小长度
        int zeroCount = lenMax - lenMin;
        boolean flag = lenMin == a.length() ?  true : false;
        if(flag){
            for(int i = 0; i < zeroCount; ++i){
                a = "0" + a;
            }
        }else{
            for(int i = 0; i < zeroCount; ++i){
                b = "0" + b;
            }
        }
        

        int temp = 0;
        int carry = 0;
        String res = "";
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i <= 9; i++) {
            set.add(i);
        }

        //如果不可以前补零的话,可以尝试双指针
        for (int i = lenMax - 1; i >= lenMax - lenMin; i--) {
            int aNum = a.charAt(i) - '0';
            int bNum = b.charAt(i) - '0';
            if (!set.contains(aNum)) {
                temp = SepcialCal(a.charAt(i), b.charAt(i)) + carry;
            } else {
                temp = aNum + bNum + carry;
            }
            carry = temp / 10;
            res = temp % 10 + res;
        }
       
        if (carry != 0) {
            res = carry + res;
        }

        res = res.substring(0, res.length() - maxLen) + "." + res.substring(res.length() - maxLen);

        System.out.println(res);
    }

    public static int SepcialCal(char c1, char c2) {
        if (c1 == '!' && c2 == '!') {
            return 0;
        }
        if (c1 == '!' && c2 == '@') {
            return 13;
        }
        if (c1 == '@' && c2 == '!') { // 符合交换率
            return 13;
        }
        if (c1 == '!' && c2 == '#') {
            return 4;
        }
        if (c1 == '#' && c2 == '!') {
            return 4;
        }
        if (c1 == '@' && c2 == '@') {
            return 7;
        }
        if (c1 == '@' && c2 == '#') {
            return 20;
        }
        if (c1 == '#' && c2 == '@') {
            return 20;
        }
        if (c1 == '#' && c2 == '#') {
            return 10;
        }
        return -1;
    }

}