J'ai essayé de résoudre le problème 54 de Leetcode - en spirale et je suis resté coincé dans une entrée vectorielle vide.
la question concerne la liste en spirale. L'entrée est un vecteur 2D et la sortie doit être une liste de vecteurs écrite par direction en spirale.
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]
le problème est lorsque l'entrée est une liste vide.
Input: []
il produit une erreur d'exécution.
un autre test réussi sauf entrée vide comme [] .
Il ne semble pas y avoir d'erreur d'exécution lors des tests sur mon terminal mac OSX, mais Leetcode dit
'Ligne 933: caractère 34: erreur d'exécution: liaison de référence au pointeur nul de type' struct value_type '(stl_vector.h)'
Voici le lien https://leetcode.com/problems/spiral-matrix/
Je joins également des codes ci-dessous ...
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;
}
};
Merci pour les commentaires, je trouve comment résoudre celui-ci moi-même. j'ai changé
if(matrix[0].size()<1
à
if(matrix.empty()) return {};
et ça a marché. J'ai également trouvé que mon algorithme était incorrect et je l'ai corrigé.
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)
Signifie que vous pouvez uniquement examiner si le vecteur est vide et revenir immédiatement. Vous ne pouvez pas faire autre chose comme déclarer des variables. Si vous avez d'autres opérations avant les examens du vecteur vide, vous obtiendrez l'avertissement ci-dessus.
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;
}