【LeetCode每日一题】 1720. 解码异或后的数组

【LeetCode每日一题】 1720. 解码异或后的数组

1720. 解码异或后的数组

取数组的最后一个元素进行异或即可。

class Solution {
public:
    vector<int> decode(vector<int>& encoded, int first) {
        vector<int> res {first};
        for (auto x : encoded) {
            res.push_back(res.back() ^ x);
        }
        return res;
    }
};

554. 砖墙

求最少穿过的砖块数量,从对立面思考,当缝隙最多时,可达到最少,我们用哈希表来存储每个缝隙,计算缝隙出现的次数,最终取反即可。

class Solution {
public:
    int leastBricks(vector<vector<int>>& wall) {
        unordered_map<int, int> um;
        for (auto w : wall) {
            for (int sum = 0, i = 0; i + 1 < w.size(); i++ ) {
                sum += w[i];
                um[sum]++;
            }
        }
        int res = 0;
        for (auto [k, v] : um) {
            res = max(res, v);
        }
        return wall.size() - res;
    }
};

7. 整数反转

c++ 取模 -7 % 3 = -1 数学上 取模 -7 % 3 = 2,假设ans表示最终结果。那么ans = ans * 10 + x % 10ans * 10可能溢出, ans与INT_MIN、INT_MAX比较,以确定是否返回0.

class Solution {
public:
    int reverse(int x) {
        int ans = 0;
        // c++ 取模 -7 % 3 = -1 数学上 取模 -7 % 3 = 2
        // ans = ans * 10 + x % 10;
        // ans * 10可能溢出 ans与INT_MIN、INT_MAX比较
        // ans > (INT_MAX - x % 10) / 10
        // ans < (INT_MIN - x % 10) / 10
        while (x) {
            if ((ans > 0 && ans > (INT_MAX - x % 10) / 10) || (ans < 0 && ans < (INT_MIN - x % 10) / 10)) return 0;
            ans = ans * 10 + x % 10;
            x = x / 10;
        }
        return ans;
    }
};

740. 删除并获得点数

采用动态规划,模仿抢劫房子这道题。

class Solution {
public:
    int deleteAndEarn(vector<int>& nums) {
        // [3,4,2]
        // dp[i] = max(dp[i-1], dp[i-2] + um[i] * i);
        unordered_map<int, int> count;
        int max_v = 0;
        for (auto x : nums) {
            count[x]++;
            max_v = max(max_v, x);
        }

        vector<int> dp(max_v + 1);
        dp[0] = 0;
        dp[1] = count[1] * 1;
        for (int i = 2; i <= max_v; i++) {
            dp[i] = max(dp[i - 1], dp[i - 2] + count[i] * i);
        }
        return dp[max_v];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值