剑指(五题)

 

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length() == 0) return 0;
        int len = s.length();
        int max = 1;
        for (int i = 0; i < len; i++) {
            char ch = s.charAt(i);
            //把遍历到的字符存起来
            Map<Character, Integer> map = new HashMap<>();
            map.put(ch, i);
            for (int j = i + 1; j < len; j++) {
                char ch1 = s.charAt(j);
                if (map.get(ch1) == null) {
                    map.put(ch1, j);
                    max = Math.max(max, j - i + 1);
                } else {
                    break;
                }
            }
        }
        return max;
    }
}

 

class Solution {
    public int maxValue(int[][] grid) {
        if (grid.length == 0) return 0;
        if (grid.length == 1 && grid[0].length == 1) return grid[0][0];
        int[][] dp = new int[grid.length][grid[0].length];
        //dp[i][j]代表到达这个位置能拿到的最大值
        //初始化
        dp[0][0] = grid[0][0];
        for (int i = 1; i < dp[0].length; i++) {
            dp[0][i] = grid[0][i] + dp[0][i - 1];
        }
        for (int i = 1; i < dp.length; i++) {
            dp[i][0] = grid[i][0] + dp[i - 1][0];
        }
        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp[0].length; j++) {
                dp[i][j] = grid[i][j] + Math.max(dp[i][j - 1], dp[i - 1][j]);
            }
        }
        return dp[dp.length - 1][dp[0].length - 1];
    }
}

 

class Solution {
    public String reverseWords(String s1) {
        if (s1.length() == 0) return "";
        // int left = 0;
        // int right = s.length() - 1;
        // while (left < right) {
        //     if (s.charAt(left) == ' ') {
        //         left++; 
        //     } else {
        //         break;
        //     }
        // }
        // while (left < right) {
        //     if (s.charAt(right) == ' ') {
        //         right--;
        //     } else {
        //         break;
        //     }
        // }
        //使用trim得返回个新的,对原数组没改动
        String s = s1.trim();
        //if (left == r) return "";
        StringBuilder sb = new StringBuilder();
        Deque<String> stack = new LinkedList<>();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != ' ') {
                sb.append(s.charAt(i));
            } else {
                //先判断后面是否在不在下标内
                if (i + 1 < s.length() && s.charAt(i + 1) == ' ') {
                    continue;
                }
                stack.push(sb.toString());
                sb.setLength(0);
            }
        }
        //sb.toString()后才是String
        stack.push(sb.toString());
        List<String> list = new ArrayList<>();
        while (!stack.isEmpty()) {
            list.add(stack.pop());
        }
        String[] res = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        //字符串数组转为字符串,字符串转为字符串数组是spilt
        return String.join(" ", res);
    }
}

//直接用最简单的方式写
//连续空格的还是不好处理啊,用api也没弄成。
// class Solution {
//     public String reverseWords(String s) {
//         String[] strings = s.trim().split(" ");
//         //StringBuilder sb = new StringBuilder();
//         int left = 0;
//         int right = strings.length - 1;
//         while (left < right) {
//             if (strings[left] == " " && strings[right] == " ") {
//                 left++;
//                 right--;
                
//             } else if (strings[left] == " ") {
//                 left++;
                
//             } else if (strings[right] == " ") {
//                 right--;
                
//             } else {
//                 String temp = strings[left];
//                 strings[left] = strings[right];
//                 strings[right] = temp;
//                 left++;
//                 right--;
//             }
            
//         }
//         return String.join(" ", strings);
//     }

// }

 

class Solution {
    public int nthUglyNumber(int n) {
        int[] dp = new int[n + 1];
        dp[1] = 1;
        int p2 = 1, p3 = 1, p5 = 1;
        for (int i = 2; i <= n; i++) {
            int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
            dp[i] = Math.min(Math.min(num2, num3), num5);
            //去重问题考虑到了呀,又不是用得if else
            if (dp[i] == num2) {
                p2++;
            }
            if (dp[i] == num3) {
                p3++;
            }
            if (dp[i] == num5) {
                p5++;
            }
        }
        return dp[n];
    }
}

 

class Solution {
    public int maxSubArray(int[] nums) {
        //int left = 0;
        
        int right = 0;
        int sum = 0;
        int res = Integer.MIN_VALUE;
        int falg = 0;
        while (right < nums.length) {
            sum += nums[right];
            if (sum < 0) {
                sum = 0;
            } 
            right++;
            if (sum > 0) {
                falg++;
                res = Math.max(res, sum);
            }
        }
        sum = 0;
        right = 0;
        int res1 = Integer.MIN_VALUE;
        while (right < nums.length) {
            res1 = Math.max(res1, nums[right]);
            right++;
        }
        
        if (falg != 0) {
            return res;
        } else {
            return res1;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值