第933行,第34个字符:运行时错误:引用绑定到空指针类型为“struct value_type”的对象(stl_vector.h)- leet code螺旋形打印。

4

我尝试解决Leetcode 问题54 - 螺旋矩阵,但在空向量输入时遇到了困难。

这个问题是关于螺旋列表的。输入是一个二维向量,输出应该是一个按螺旋方向写成的向量列表。

Input:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

问题在于输入为空列表。
Input: [] 

它产生了运行时错误。

除了空输入(如[])之外,其他测试用例都通过了。

在我的Mac OSX终端中进行测试似乎没有运行时错误,但Leetcode说:

'Line 933: Char 34: runtime error: reference binding to null pointer of type 'struct value_type' (stl_vector.h) '

这是链接 https://leetcode.com/problems/spiral-matrix/

我还附上了代码...

class Solution {
public:

vector<int> answer;
int left = 0, right = 0; 
vector<int> spiralOrder(vector<vector<int>>& matrix) {
    if(matrix[0].size()<1) return {};
    vector<vector<int>> flag(matrix.size(),vector<int>(matrix[0].size(),0));
        while(1){
           flag[left][right] =1;
           answer.push_back(matrix[left][right]);

           if(right+1<matrix[0].size() && flag[left][right+1] == 0){
               ++right;
               continue;
           }
           else if(left+1<matrix.size() && flag[left+1][right] == 0 ){
               ++left;
               continue; 
           }
           else if(right-1>=0 && flag[left][right-1]==0){
               --right;
               continue;
           }
           else if(left-1>=0  && flag[left-1][right]==0){
               --left;
               continue;
           }
           else break;
        }
    return answer; 
}
};

1
如果你想要代码帮助,你应该提供一个 [mcve]。无论如何,你甚至没有提出问题。 - Ulrich Eckhardt
3
你确定 matrix 不是空的吗?如果是空的,那么 matrix[0] 将表现出未定义的行为。你很好奇为什么需要检查第二维的大小,但没有检查第一维。 - Igor Tandetnik
感谢@IgorTandetnik,我检查了我的代码中一些不足的行。我将 ('if(matrix[0].size()<1) return {};') 更改为 ('if(matrix.empty()) return {};') 然后它就可以工作了。 - dante
2个回答

4
感谢留言,我自己解决了这个问题。 我修改了

if(matrix[0].size()<1

为了

if(matrix.empty()) return {};

它运行成功了。 同时,我发现我的算法有误并将其修正。

    using namespace std;

    enum class Direction{
          RIGHT,
          DOWN,
          LEFT,
          UP
        };
    class Solution {
    public:
        Direction direc;
        vector<int> answer;
        int left = 0, right = 0; 
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
          Direction direc = Direction::RIGHT;
          if(matrix.empty()) return {};
        vector<vector<int>> flag(matrix.size(),vector<int>(matrix[0].size(),0));

            while(1){
              flag[left][right] =1;
              answer.push_back(matrix[left][right]);
              switch(direc){
              case Direction::RIGHT:        
               if(right+1<matrix[0].size() && flag[left][right+1] == 0){
                   ++right;
                   continue;
               }
               else if(left+1<matrix.size() && flag[left+1][right] == 0 ){
                   ++left;
                   direc = Direction::DOWN;
                   continue; 
               }
               else break;
             case Direction::DOWN:
              if(left+1<matrix.size() && flag[left+1][right] == 0 ){
                   ++left;
                   continue;
                }
              else if(right-1>=0 && flag[left][right-1]==0){
                   --right;
                   direc = Direction::LEFT;
                   continue;
               }
               else break;
              case Direction::LEFT: 
               if(right-1>=0 && flag[left][right-1]==0){
                   --right;
                   continue;
               }
               else if(left-1>=0  && flag[left-1][right]==0){
                   --left;
                   direc = Direction::UP;
                   continue;
              }
               else break; 
              case Direction::UP:
               if(left-1>=0  && flag[left-1][right]==0){
                   --left;
                   continue;
              }
               else if(right+1<matrix[0].size() && flag[left][right+1] == 0){
                   ++right;
                   direc = Direction::RIGHT;
                   continue;
               }
               else break;
            }
            break;
          } // switch-case
        return answer; 
    }
};

0
第923行,第9个字符:运行时错误:对类型为‘std::__cxx11::basic_string, std::allocator >’的空指针进行引用绑定(stl_vector.h)
意味着你只能检查向量是否为空并立即返回。 你不能做其他事情,比如声明变量。 如果在检查空向量之前有其他操作,则会收到上述警告。
class Solution {
        public:
       string longestCommonPrefix(vector<string>& strs) {
    if(strs.size() == 0)
        return "";
    int len = strs.size();
    int lens = strs[0].size();

    string result = "";

    for(int i = 0;i < lens;i++)
    {
        for(int j = 1;j < len;j++)
        {
            if(strs[0][i]!=strs[j][i])
            {
                return result;
                break;
            }
        }
        result+=strs[0][i];
    }
    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接