快捷搜索: 王者荣耀 脱发

ACM总结——压行坑之类型坑

我在力扣OJ 1314. 矩阵区域和 里面,我写了一个小函数:

int f(vector<vector<int>> &mat, int i, int j)
    {
        if (i < 0 || j < 0) return 0;
        if (i >= mat.size()) i = mat.size() - 1;
        if (j >= mat[0].size()) j = mat[0].size() - 1;
        return mat[i][j];
    }

这是一个已经AC的代码里面的一个函数,然而,故事并没有结束。

为了压缩行,我改成了:

int f(vector<vector<int>> &mat, int i, int j)
    {
        return (i < 0 || j < 0) ? 0 : mat[min(i,mat.size() - 1)][min(j,mat[0].size() - 1)];
    }

结果编译错误,为什么呢?

因为size函数返回的是unsigned long

我改成:

int f(vector<vector<int>> &mat, unsigned int i,unsigned int j)
    {
        return (i < 0 || j < 0) ? 0 : mat[min(i,mat.size() - 1)][min(j,mat[0].size() - 1)];
    }

还是编译错误,再改成

int f(vector<vector<int>> &mat, unsigned long i,unsigned long j)
    {
        return (i < 0 || j < 0) ? 0 : mat[min(i,mat.size() - 1)][min(j,mat[0].size() - 1)];
    }

结果编译成功但是居然解答错误。

仔细一看,这个代码就是一坨垃圾,i<0根本就是不可能的。

如果非要压缩行的话,只能做类型转换。

经验分享 程序员 微信小程序 职场和发展