Leetcode刷题 2021.02.25

Leetcode537 翻转图像

给定两个表示复数的字符串。

返回表示它们乘积的字符串。注意,根据定义 i2 = -1 。

比较简单的题吧,就按照乘法公式来就行了。

class Solution {
    public String complexNumberMultiply(String a, String b) {
        String[] arrA = a.split("\\+");
        String[] arrB = b.split("\\+");
        int ra = Integer.parseInt(arrA[0]);
        int rb = Integer.parseInt(arrA[1].substring(0, arrA[1].length() - 1));
        int c = Integer.parseInt(arrB[0]);
        int d = Integer.parseInt(arrB[1].substring(0, arrB[1].length() - 1));
        int real = ra * c - rb * d;
        int virtual = rb * c + ra * d;
        return real + "+" + virtual + 'i';
    }
}

Leetcode554 砖墙

你的面前有一堵矩形的、由多行砖块组成的砖墙。 这些砖块高度相同但是宽度不同。你现在要画一条自顶向下的、穿过最少砖块的垂线。

砖墙由行的列表表示。 每一行都是一个代表从左至右每块砖的宽度的整数列表。

如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你需要找出怎样画才能使这条线穿过的砖块数量最少,并且返回穿过的砖块数量。

你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。

这题也是比较容易想到的,就遍历一下每个元素就行了,哪里有裂缝就添加一下,最后就用n减去最大的裂缝就是穿过最小的砖的数量了。

class Solution {
    public int leastBricks(List<List<Integer>> wall) {
        int n = wall.size();
        Map<Integer, Integer> map = new HashMap<>();
        int max = 0;
        for(List<Integer> list : wall){
            int sum = 0;
            //注意两边不能算,所以遍历到list.size() - 1
            for(int i = 0; i < list.size() - 1; i++){
                sum += list.get(i);
                map.put(sum, map.getOrDefault(sum, 0) + 1);
                max = Math.max(max, map.get(sum));
            }
        }
        return n - max;
    }
}

Leetcode1432 改变一个整数能得到的最大差值

给你一个整数 num 。你可以对它进行如下步骤恰好 两次 :

选择一个数字 x (0 <= x <= 9).
选择另一个数字 y (0 <= y <= 9) 。数字 y 可以等于 x 。
将 num 中所有出现 x 的数位都用 y 替换。
得到的新的整数 不能 有前导 0 ,得到的新整数也 不能 是 0 。
令两次对 num 的操作得到的结果分别为 a 和 b 。

请你返回 a 和 b 的 最大差值 。

这题比较容易做,但是自己编码比较复杂,就是把所有的情况都想到计算一下就行了。

class Solution {
    public int maxDiff(int num) {
        char[] arr = String.valueOf(num).toCharArray();
        int index = -1, n = arr.length;
        char[] max = Arrays.copyOf(arr, n);
        char[] min = Arrays.copyOf(arr, n);
        for(int i = 0; i < n; i++){
            if (arr[i] != '9'){
                index = i;
                break;
            }
        }
        if (index != -1){
            for(int i = 0; i < n; i++){
                if (max[i] == arr[index]){
                    max[i] = '9';
                }
            }
        }else{
            max = arr;
        }
        index = -1;
        if (arr[0] != '1'){
            for(int i = 0; i < n; i++){
                if (min[i] == arr[0]){
                    min[i] = '1';
                }
            }
        }else{
            for(int i = 1; i < n; i++){
                if (arr[i] != '0' && arr[i] != '1'){
                    index = i;
                    break;
                }
            }
            if (index != -1){
                for(int i = 1; i < n; i++){
                    if (min[i] == arr[index]){
                        min[i] = '0';
                    }
                }
            }else{
                min = arr;
            }
        }
        int res = 0;
        for(int i = 0; i < n; i++){
            res += (int)(max[i] - min[i]) * Math.pow(10, n - i - 1);
        }
        return res;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值