华为2018实习生机试题目

更了一下第三题题解,之前考虑的不全面

  • 100分

题目 emmm 有点抽象,扯到什么无线通信最大径啥的,不过抽象出来就是这个意思:

找一组数字中(共21个),四个连续的数字的和最大,然后输出这四个数字的第一个数字的序号。

如果有和是相同的,就输出那个序号小的。

最直接的思路就是:
用map存数字和对应下标,然后逐个求出四个数字的和,再比较大小

  • 200分

标准键盘和自然键盘,小x(忘了叫啥了)以为自己用的是标准键盘,实际用的是自然键盘,请输出小x实际想输出的内容。

类似于翻译密码那种题

我。。。emmm 暴力做的

  • 300分

求最大子序列和

这个题我没有ac,一开始以为是输入格式没处理好,后来发现不止这一个问题,当时写的时候没有考虑全负的输入这种情况。

我的思路是:只要前面算的和为负数,就放弃这个结果,但是对于数组中值全负需要单独考虑。

但是剑指offer这个题,以及牛客上这个题给的测试用例应该是都没包含全负的情况的,因为我写的时候没有考虑全负,但是也都通过了。

测试用例比较全的是leetcode,附带我在github上记录的题解 shelbylee/My-Notes(最近狂刷题,欢迎大家一起学习)

下面附上正确且高效的解法:

class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        int ret = Integer.MIN_VALUE;
        int sum = 0;

        for (int i = 0; i < len; i++) {
            if (sum <= 0) sum = nums[i];
            else sum += nums[i];

            ret = Math.max(ret, sum);
        }

        return ret;
    }
}

下面是一些有缺陷的解法,大家看看长教训就好。

不考虑输入为全负的做法

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        int len = array.length;

        if (len <= 0 || array == null) return 0;

        int cur_sum = 0;
        int max = 0;

        for (int i = 0; i < len; i++) {
            if (cur_sum <= 0) cur_sum = array[i];
            else cur_sum += array[i];

            if (cur_sum > max) max = cur_sum;
        }
        if (max == 0) return -1;
        return max;
    }
}

然后我写的考虑全负的做法,可以通过leetcode全部测试用例,但是效率很低,只beats了4.58%:

class Solution {
    public int maxSubArray(int[] nums) {
        int len = nums.length;
        int sum = 0;
        int max = 0;

        // 只有一个元素
        if (len == 1) return nums[0];

        // 数组元素非全负
        for (int i = 0; i < len; i++) {
            if (sum < 0) sum = nums[i];
            else sum += nums[i];

            if (sum > max) max = sum;
        }

        // 数组元素全负,问题变成了找数组中最大值
        if (max == 0) {
            int tmp = nums[0];
            for (int i = 0; i < len; i++) {
                if (nums[i] > tmp) {
                    tmp = nums[i];
                }
            }
            max = tmp;
        }

        return max;
    }
}

你可能感兴趣的:(笔试)