LeetCode : 06Transformation en zigzag

Transformation en zigzag

sujet

convertir une chaîne donnée sss selon le nombre de lignes donnénum R ows numRowsn u m R o w s à zigzaguer de haut en bas et de gauche à droite.
Par exemple, lorsque la "PAYPALISHIRING" chaîne
insérez la description de l'image ici

Après cela, votre sortie doit être lue ligne par ligne de gauche à droite pour produire une nouvelle chaîne, par exemple : "PAHNAPLSIIGYIR".

Veuillez implémenter cette fonction pour convertir une chaîne en un nombre spécifié de lignes :

string convert(string s, int numRows);

exemple

insérez la description de l'image ici


Méthode 1 : simuler le processus de transformation

Pour analyser le sujet, considérons le zigzag comme une matrice bidimensionnelle. Le processus de transformation est simplement décrit comme : remplissez les caractères de la chaîne dans la matrice bidimensionnelle à son tour, et l'ordre de remplissage est de [0][0 ] vers le bas, en remplissant Entrez numRows lignes, puis remplissez un caractère à la fois selon [nombre de lignes-1][nombre de colonnes+1] jusqu'à ce que le nombre de lignes=0, puis remplissez successivement, remplissez numRows rows puis suivez [number of rows- 1][Number of columns+1] Remplissez un caractère à la fois, répétez le cycle jusqu'à ce que tous les caractères de la chaîne soient remplis, et enfin triez la chaîne finale en fonction du manière de lire les lignes.

Méthode pour réaliser

Utilisez un conteneur Vector pour stocker les éléments de chaque ligne, et le zigzag final a un total de numRows lignes, donc initialisez d'abord un Vector contenant des éléments numRows, et mettez les caractères de la ième ligne dans le Vector à tour de rôle selon le ordre de la transformation en zigzag Dans le i-ème élément, les chaînes de chaque élément du vecteur sont finalement concaténées dans le résultat final.

Définir un index vIndex pour aller et venir entre [0, numRows-1], indiquant que le caractère actuel correspond au nombre de lignes dans la matrice bidimensionnelle, et les caractères de la chaîne sont ajoutés séquentiellement à l'élément vIndex dans le vecteur.
insérez la description de l'image ici

Code

class Solution {
    
    
public:
    string convert(string s, int numRows) {
    
    
      //用来遍历字符串 s 的索引
      int index = 0;
      int size = s.length();
    
      if (numRows == 1 || numRows >= size) {
    
    
        cout << s << endl;
        return 0;
      }
      
      vector<string> nRes(numRows, "");
      //vIndex用来指向当前元素对应在二维矩阵的行数,同样是Vector的元素索引
      int vIndex = 0;
      //判断当前行数索引应该递增还是递减
      bool add = true;
      
      while (index < size)
      {
    
    
        //从第0行往下依次填入 numRows 个元素
        while (index < size && add) {
    
    
          nRes[vIndex] += s[index];
          vIndex++;
          index++;
          if (vIndex == numRows) {
    
    
            add = false;
          }
        }
        vIndex -= 2;
        //按照 [行数-1][列数+1] 每次填入一个字符,直到 行数=0
        while (!add && index < size) {
    
    
          nRes[vIndex] += s[index];
          vIndex--;
          index++;
          if (vIndex == -1) {
    
    
            add = true;
          }
        }
        vIndex += 2;
      }
      string res = "";
      for (string var : nRes)
      {
    
    
        res += var;
      }
      return res;
};

Après avoir lu la solution sur Likou, j'ai aussi trouvé la loi de transformation et l'ai exprimée à l'aide de formules mathématiques. L'idée est similaire et peut servir de référence.

Je suppose que tu aimes

Origine blog.csdn.net/qq_33021529/article/details/125860230
conseillé
Classement