Leetcode問題54-スパイラルを解決しようとしましたが、空のベクトル入力で行き詰まりました。
問題はスパイラルリストについてです。入力は2Dベクトルで、出力はらせん方向で書かれたベクトルリストでなければなりません。
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は言う
'933行目:Char 34:実行時エラー:タイプ' struct value_type '(stl_vector.h)のnullポインターへの参照バインディング'
こちらがリンクです 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;
}
};
コメントをありがとう、私はこれを自分で解決する方法を見つけました。私が変更され
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;
}
};
Line 923: Char 9: runtime error: reference binding to null pointer of type 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >' (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;
}