Likou Brush Hundred Days Plan Day4 Transformação em forma de Z

alvo de aprendizagem:

Continuarei a atualizar minhas ideias de algoritmos exclusivos, esperando trazer a você uma expansão de pensamento diferente!
Se você achar útil, por favor, curta, siga e apoie!
Seu incentivo é o que me faz continuar!
! ! !

Link Oficial da Pergunta 6 do Banco de Perguntas do Likou


Conteúdo de Aprendizagem:

transformação em ziguezague

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

Exemplo 1:

Entrada: s = "PAYPALISHIRING", numRows = 3
Saída: "PAHNAPLSIIGYIR"
Exemplo 2:
Entrada: s = "PAYPALISHIRING", numRows = 4
Saída: "PINALSIGYAHRPI"
Explicação:
PIN
ALSIG
YAHR
PI
Exemplo 3:

Entrada: s = "A", numRows = 1
Saída: "A"

提示:

1 <= s.length <= 1000
s 由英文字母(小写和大写)、',''.' 组成
1 <= numRows <= 1000

Fonte: LeetCode
Link: https://leetcode-cn.com/problems/zigzag-conversion

tempo de estudo:

10.01.2022


Saída de aprendizagem:

Pensamento 1
insira a descrição da imagem aqui
Por que demora tanto para executar?
Como a lógica do algoritmo não é inteligente o suficiente, é o resultado de uma solução difícil. Mas a ideia do design é bastante inteligente!

Idéias para solução
insira a descrição da imagem aqui
de problemas 1. Primeiro, podemos usar um array bidimensional para armazenar a sequência de caracteres Z e, em seguida, ler o array bidimensional para obter o resultado
2. Como construímos esse array bidimensional? Primeiro, obtenha o número de linhas e colunas da matriz. O número de linhas deve ser numRows, então e o número de colunas? Após uma análise cuidadosa, não é difícil descobrir que o número de colunas é, na verdade, o comprimento da string s dividido por dois mais um.
3. Como podemos colocar isso em ordem de ziguezague? Só precisamos colocar os caracteres da string um por um na ordem de cima para baixo. Para isso, escrevi um método para obter um caractere de uma string, na verdade, esse processo pode ser feito com uma fila, mas a lógica é relativamente simples, então uso um ponteiro.
4. O ponto é que atravessamos a primeira coluna primeiro e depois atravessamos a segunda coluna. De acordo com os requisitos do título, podemos encontrar a regra, se o número de linhas for 4, haverá duas colunas curtas entre as duas colunas longas e, se o número de linhas for 3, haverá um curto coluna entre as duas colunas longas. Na verdade, é muito simples, ou seja, a primeira e a última parte da coluna curta não possuem elementos. Então, como sabemos se a coluna atual é uma coluna longa ou uma coluna curta? Por índice, podemos pegar o restante do índice atual por numRows - 1, que é uma coluna longa se for 0. Por exemplo, índice 0, coluna longa, neste momento numRows é 3, então o restante é 0 é 2. 2%(3-1)==0
5. Já sabemos como julgar a coluna longa e a coluna curta , nós apenas Você pode usar dois loops for para iterar em todo o array bidimensional. Se for uma coluna longa, basta escrever de cima para baixo. Se for uma coluna curta, escreva de baixo para cima e vá além dos dois pontos na borda. Ao escrever uma coluna longa, podemos escrever para a coluna inteira, mas ao escrever uma coluna curta, temos que sair depois de escrever uma e depois ir para a próxima coluna. Porque há apenas uma coluna curta por coluna.
6. Escrevemos # depois que todas as strings são retiradas. Porque se o array Char não for atribuído, o valor padrão é '\u0000', então, quando gerarmos o resultado, precisamos apenas usar dois loops for para percorrer o array bidimensional e, em seguida, julgar, se não for # ou \u0000, grave-o.
7. Retorne a string gravada, que é a string Z que queremos.

public class Solution {
    
    
    public string Convert(string s, int numRows) {
    
    
        //(s.Length/numRows)*2-1就是Z型数组长度
        //numRows就是宽度
        //s的长度除以宽度就是 最长的列的个数
        //Z型数组长度减去最长的列的个数 就是短列的个数
        //如果传入s长度14  rows为3
        //那么Z型数组长度为(14/3)*2-1=7
        //最长列个数为14/3 为4
        //短列为7-4 为3
        //其次我们还需要用长度
        
        if(s.Length==0||s.Length==1||numRows==1)return s;

        int ArrayLength=s.Length/2+1;   //Z型数组长度   7
        int LongLength=(s.Length/numRows);
        int ShortLength=ArrayLength-LongLength;
        int between=numRows-2;  //短的        //2
      
        char[,] rows=new char[numRows,ArrayLength];
        
        int curindex=-1; //现在放入的个数
        
        for(int i=0;i<ArrayLength;i++){
    
      //0-6
            for(int j=0;j<numRows;j++){
    
       //0-2
               // if(curCount>=s.Length){
    
    
               //     rows[j,i]='#';
               //     continue;
               // }

                if((i%(between+1)!=0&&i!=0) ){
    
     //是短列
                    if(numRows>2){
    
    
                        if(j==0||j==numRows-1){
    
     //奇数列头尾两个不设值
                            rows[numRows-i%(between+1)-1,i]='#';
                        }else{
    
    
                            rows[numRows-i%(between+1)-1,i]=GetOneChar();
                            break;
                        }
                    }else{
    
    
                        rows[numRows-i%(between+1)-1,i]=GetOneChar();
                        break;
                    }
                }else{
    
    
                    rows[j,i]=GetOneChar();
                } 
                
            }
        }

        string ss="";
        for(int i=0;i<numRows;i++){
    
    
            for(int j=0;j<ArrayLength;j++){
    
    
                if(rows[i,j]!='#'&&rows[i,j]!='\u0000'){
    
    
                    ss+=rows[i,j];
                }
            }
        }

        ss.Replace("\u0000", string.Empty);
        return ss;


        char GetOneChar(){
    
    
            curindex++;
            if(curindex>=s.Length){
    
    
                 return '#';
            }else{
    
    
                return s[curindex];
            }
        }
    }
}

Autor: cobaia Xiaohuihui
Os direitos autorais pertencem ao autor. Para reimpressões comerciais, favor contatar o autor para autorização, e para reimpressões não comerciais, favor indicar a fonte.

Acho que você gosta

Origin blog.csdn.net/m0_48781656/article/details/122416452
Recomendado
Clasificación