50题目描述:

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

解析:

1.HashMap方法,如果字符串s为空或者长度为0,则返回单空格
2.for循环遍历字符串s,使用哈希表统计各字符数量是否大于1
3.再for循环遍历字符串s,在哈希表中找到首个数量为1的字符,然后直接返回改字符
4.若没有找到,则返回单空格

Java:

public char firstUniqChar(String s) {
        if(s == null || s.length() == 0) {
            return ' ';
        }
        HashMap<Character, Integer> map = new HashMap<>();
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(map.containsKey(c)) {
                map.put(c, map.get(c) + 1);
            } else {
                map.put(c, 1);
            }
        }
        for(int i = 0; i < s.length(); i++) {
            if(map.get(s.charAt(i)) == 1) {
                return s.charAt(i);
            }
        }
        return ' ';
    }

JavaScript:

var firstUniqChar = function(s) {
    if(s === null || s.length === 0) {
        return ' ';
    }
    const map = new Map();
    for(let i = 0; i < s.length; i++) {
        if(map.has(s[i])) {
            map.set(s[i], map.get(s[i] + 1));
        } else {
            map.set(s[i], 1);
        }
    }
    for(let i = 0; i < s.length; i++) {
        if(map.get(s[i]) === 1) {
            return s[i];
        }
    }
    return ' ';
};

47题目描述:

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

解析:

1.动态规划,m为行的长度,n为列的长度,创建一个二维数组,用来保存每个格子能取到的礼物的最大价值
2.遍历数组,取到当前礼物的最大价值是这个礼物的(上一格或左面一格)两个中最大的价值加上当前礼物的价值,把这个值存在二维数组中(dp[i][j]表示从grid[0][0]到grid[i - 1][j - 1]时的最大价值)
3.最后返回二维数组的最后一个值就是最大的价值,即dp[m][n]

Java:

public int maxValue(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[][] dp = new int[m + 1][n + 1];
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }
        return dp[m][n];
    }

JavaScript:

var maxValue = function(grid) {
    let m = grid.length, n = grid[0].length;
    let dp = Array(m+1).fill(null).map(d=>Array(n+1).fill(0));
    for(let i = 1; i <=m; i++) {
        for(let j = 1; j <= n; j++) {
            dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
        }
    }
    return dp[m][n];
};