力扣双周赛第59期第二题及整数转罗马数字

706 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

1975. 最大方阵和

截屏2021-08-27 下午11.20.28.png

思路分析

这道题我看个图和题目名称就有种强烈的前缀和的既视感,但是仔细看下好像并不是,首先目的是求方阵元素的最大和,同时我们又可以无限次的对公共边进行乘以-1操作,对于两个正数,-1操作肯定是亏的,对于两个负数,-1操作会将其转为两个正数,对于一正一负的情况,-1操作会互换-1的位置。

因此我们大胆猜测,如果题目中有偶数个-1,那么最大和为abs(arr[i])的和,如果有奇数个-1,那么最大和为abs(arr[i])的和减去abs(arr[i])最小值*2

long long maxMatrixSum(vector<vector<int>>& matrix) {
        int numfushu = 0;
        long long  ret = 0;
        int mi = 100000;
        for(int i = 0; i < matrix.size(); i++){
            for(int j = 0; j < matrix[i].size(); j++){
                if(matrix[i][j] < 0 ){
                    numfushu++;
                }
                int ab = abs(matrix[i][j]);
                ret += ab;
                mi = min(ab, mi);
            }
        }
        if (numfushu % 2 == 0)return ret;
        return ret - mi * 2;
    }

答案果然是这么回事,完全不能理解为啥非要用longlong卡一下。

12. 整数转罗马数字

截屏2021-08-27 下午11.45.22.png

思路分析

这道题对于普通用例来说,比如27,其实就是一道不断的判断数字大小并除法再取余数,比如27就是小于50大于10,27 / 10 = 2 27 % 10 = 7, 7 小于10大于5 7 / 5 = 1 7 % 5 = 2。

需要关注的仅仅是对特例的处理。

答案使用硬编码的思路另辟奇径的解决了这个问题(作者在看到答案后将自己的垃圾代码删掉了)

const string thousands[] = {"", "M", "MM", "MMM"};
const string hundreds[]  = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const string tens[]      = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const string ones[]      = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

class Solution {
public:
    string intToRoman(int num) {
        return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
    }
};