商汤科技2020-8-20开发笔试A卷

三道题
一:给定一个字符串,找“Good”,字符顺序不可变,每个字符只能用一次

class Solution {
    public int method(char[] chars) {
        if (chars.length < 4)
            return 0;
        int res = 0;
        int numOfG = 0, numOfO = 0;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == 'G')
                numOfG++;
            if (chars[i] == 'o') {
                if (numOfG > 0)
                    numOfO++;
            }
            if (chars[i] == 'd') {
                if (numOfG > 0 && numOfO >= 2) {
                    res++;
                    numOfG--;
                    numOfO = numOfO - 2;
                }
            }
        }
        return res;
    }
}

二、最常上升子序列,leetcode原题

class SolutionMainTwo {
    public int[][] cur = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    public int r, c;

    public int method(int[][] array, int n, int m) {
        if (n == 0 || m == 0 || array == null)
            return 0;
        r = n;
        c = m;
        int[][] curArray = new int[r][c];
        int ans = 0;
        for (int i = 0; i < r; ++i) {
            for (int j = 0; j < c; ++j) {
                ans = Math.max(ans, methodDFS(array, i, j, curArray));
            }
        }
        return ans;
    }

    private int methodDFS(int[][] matrix, int row, int column, int[][] curArray) {
        if (curArray[row][column] != 0)
            return curArray[row][column];
        ++curArray[row][column];
        for (int[] ints : cur) {
            int newRow = row + ints[0];
            int newColumn = column + ints[1];
            if (newRow >= 0 && newRow < r && newColumn >= 0 && newColumn < c && matrix[newRow][newColumn] > matrix[row][column]) {
                curArray[row][column] = Math.max(curArray[row][column], methodDFS(matrix, newRow, newColumn, curArray) + 1);
            }
        }
        return curArray[row][column];
    }
}

三、大意是求删除区间的个数,可以使得删除后剩下的区间彼此不重叠(好像是这个意思)

class SolutionMainThree {
    /**
     *
     * @param intervals int整型二维数组
     * @return int整型
     */
    public int eraseOverlapIntervals (int[][] intervals) {
        // write code here
        if (intervals.length == 0)
            return 0;
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0]-o2[0];
            }
        });
        int result = 0;
        int cur = 0;
        int len = intervals.length;
        for (int i = 1; i < len; i++) {
            if (intervals[cur][1]>intervals[i][0]){
                if (intervals[cur][1]>intervals[i][1])
                    cur = i;
                result++;
            }else{
                cur = i;
            }
        }
        return result;
    }
}

如果所有大厂的笔试都这么简单就好了

#笔试题目##商汤科技#
全部评论
楼主第一题,对GoooooGdd 这种,返回结果不就成了2吗
3
送花
回复
分享
发布于 2020-08-20 22:12
第一题测试用例太不好了吧: 123 GoodoodGGoooddjfhjdGGooo3dk dggggGoood0123\n 怎么就有5个Good了,不应该是4个吗?🙂
点赞
送花
回复
分享
发布于 2020-08-20 21:59
秋招专场
校招火热招聘中
官网直投
第二题,c++也这个方法,一只80%
点赞
送花
回复
分享
发布于 2020-08-20 22:05
第一题一开始理解错题目,后来理解对了,发现思路错了,"Good"要按顺序计算。
点赞
送花
回复
分享
发布于 2020-08-20 22:14
请问第二题是力扣哪一题呀
点赞
送花
回复
分享
发布于 2020-08-20 22:29
第一道题我的思路是: 1. 遍历一遍,G、o、d的位置分别存成三个队列,qg, qo, qd 2. 将qg.top()与qo.top()作对比,前者小于后者则连续pop两个qo中的元素,然后对比第二个pop()掉的元素与qd.top(),如果比他大,则找到一个"Good" 3. 2以外的情况均直接返回或者pop掉不符合条件的元素
点赞
送花
回复
分享
发布于 2020-08-23 18:27
楼主面试了吗?
点赞
送花
回复
分享
发布于 2020-09-04 13:53

相关推荐

点赞 15 评论
分享
牛客网
牛客企业服务