面试被虐题— 谨以此致,mark一个悲惨的下午

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wxs0124/article/details/50853742

BGM

昨天去一家公司面试,被面试官从技术层面虐翻。谨以此致mark自己的不足。

废话少说,开虐!!!

1, 手写两个超大数相加

注: 两个数的位数超出计算机系统的int值内存范围。

过程:
大体的思路是这样:
1,既然超出int的范围,那么我们用字符串来存储数字。
2,基本的解决思路,按对应位相加,(必须考虑进位)。
3,考虑边界值eg:进位,正负号。

贴一个没有考虑正负号的java代码,大家共勉:
转自一篇博客

public class BigNumSum {
    public static void main(String[] args) {
        int[] result = bigNumSum("999999999999999", "99999999999999999");
        for(int i=0; i < result.length; i++) {
            System.out.print(result[i]);
        }
    }

    public static int[] bigNumSum(String num1, String num2) {
        String number1 = num1;
        String number2 = num2;
        char[] ch1 = number1.toCharArray();
        char[] ch2 = number2.toCharArray();
        int[] sum;
        int len = Math.abs(ch1.length - ch2.length);
        boolean flag = false; //为true时表示两数相加>=10

        if(ch1.length == ch2.length) { //如果两个数的长度相等
            sum = new int[ch1.length+1]; //相加结果的长度为任一长度+1,因为最高位相加可能>10

            for(int i=ch1.length-1; i>=0; i--) { //从个位开始相加
                if(flag) {
                    sum[i+1] = (int)(ch1[i] - '0') + (int)(ch2[i] - '0') + 1;
                }
                else {
                    sum[i+1] = (int)(ch1[i] - '0') + (int)(ch2[i] - '0');
                }
                flag = handleSumOverTen(sum, i, len); //处理两数相加是否>10
            }

            handleTopDigit(flag, sum); //处理最高位
            return sum;
        }
        else if(ch1.length > ch2.length) { //如果数1的长度大于数2的长度
            sum = new int[ch1.length+1]; //结果的长度为数1的长度+1

            for(int i=ch2.length-1; i>=0; i--) {
                if(flag) {
                    sum[i+len+1] = (int)(ch1[i+len] - '0') + (int)(ch2[i] - '0') + 1;
                }
                else {
                    sum[i+len+1] = (int)(ch1[i+len] - '0') + (int)(ch2[i] - '0');
                }

                flag = handleSumOverTen(sum, i, len);
            }

            for(int i=ch1.length-ch2.length-1; i>=0; i--) { //处理数1多出来的位数
                if(flag) {
                    sum[i+1] = (int)(ch1[i] - '0') + 1;
                }
                else {
                    sum[i+1] = (int)(ch1[i] - '0');
                }
                flag = handleSumOverTen(sum, i, 0);
            }

            handleTopDigit(flag, sum);
            return sum;
        }
        else {
            sum = new int[ch2.length+1];

            for(int i=ch1.length-1; i>=0; i--) {
                if(flag) {
                    sum[i+len+1] = (int)(ch1[i] - '0') + (int)(ch2[i+len] - '0') + 1;
                }
                else {
                    sum[i+len+1] = (int)(ch1[i] - '0') + (int)(ch2[i+len] - '0');
                }

                flag = handleSumOverTen(sum, i, len);
            }

            for(int i=ch2.length-ch1.length-1; i>=0; i--) {
                if(flag) {
                    sum[i+1] = (int)(ch2[i] - '0') + 1;
                }
                else {
                    sum[i+1] = (int)(ch2[i] - '0');
                }
                flag = handleSumOverTen(sum, i, 0);
            }

            handleTopDigit(flag, sum);
            return sum;
        }
    }

    /*
     * 处理两数相加是否>10
     */
    public static boolean handleSumOverTen(int[] sum, int i, int len) {
        boolean flag = false;
        if(sum[i+len+1] >= 10) {
            sum[i+len+1] = sum[i+len+1] - 10;
            flag = true;
        }
        else {
            flag = false;
        }
        return flag;
    }

    /*
     * 处理最高位
     */
    public static void handleTopDigit(Boolean flag, int[] sum) {
        if(flag) {
            sum[0] = 1;
        }
        else {
            sum[0] = 0;
        }
    }
}

此题思路我说的对,但是重点考察你的代码,代码0分。

2, iOS 系统键盘和搜狗键盘互相切换的问题

ps: 这个真没有处理过。
先写到这,还有东西要做,回头来更新

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页