título Descrição
Introduzir uma matriz, a fim de fora para dentro num sentido horário para imprimir sequencialmente para cada número, por exemplo, se introduzir a seguinte matriz 4 x 4: 1,234,567,891,011,121,314 15 sequencialmente impresso 16 digitais 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
Resolver um problema: transformar ciclo
. 1 pública estática do ArrayList <Integer> printMatrix ( int [] [] Matrix) { 2 a ArrayList <Integer> = Resultado new new ArrayList <Integer> (); . 3 IF (matrix.length == 0 ) { . 4 retorno Resultado; . 5 } 6. // número de linhas e colunas da inicialização matriz 7. int fileira = matrix.length, coluna = matriz [0 ] .length; . 8 SE (coluna == 0 ) { 9. // Se o número de linhas na matriz não é 0, o número de colunas da matriz ele é 0, ou seja, os elementos vazios da matriz, ainda vazio lista 10 de retorno Resultado; . 11 } 12 é / * 13 é * um loop por camadas As camadas são, quanto menor for o valor determinado pelas linhas e colunas, quanto menor for o valor -1 é um número ímpar, de modo a considerar o caso, 14 * é dividido por 2 porque o início de cada ciclo são devidos a esquerda inferior para a direita e da direita para a esquerda enquanto que a linha Passado 2, de modo que só pode tomar metade 15 * 0,5 + 1, a fim de compensar a camada precedente, e em que pelo menos uma camada de a -1 condição par-ímpar provoca 16 * / . 17 int = Camadas (Math.min (linha, coluna) -1) / 2 + 1. ; 18 é para ( int i = 0; I <Camadas; i ++ ) { . 19 / * 20 é * a partir do canto superior esquerdo para os elementos superior direita da diagonal a partir de , uma vez que em cada um deles a partir do canto inferior esquerdo para o canto superior esquerdo irá utilizar-se uma pluralidade de linha elemento anterior actual, de modo que o início j = i. 21 * atravessando o índice é menor do que o número de colunas das camadas de matriz subtraindo-se o ciclo actual, como nas fases anteriores direito de elemento inferior direito da linha corrente irá ser passado para trás 22 é * * / 23 é para ( intI = J; J <coluna-i, j ++ ) { 24 result.add (Matrix [I] [J]); 25 } 26 é / * 27 * da direita superior para a direita inferior, uma vez que esta rodada será deixada para o canto superior direito de multi gasto acima de elementos de coluna de corrente, de modo que o início k = i + 1. 28 * atravessando o índice é menor do que o número de linhas de camadas de matriz subtraindo-se o ciclo actual, porque as primeiras voltas do canto inferior direito para o elemento inferior esquerdo será gasto na sequência da coluna corrente. 29 * A coluna máxima matriz índice é-coluna 1 (a partir de 0), os elementos do número da coluna lista coluna resultado enchimento menos as camadas de índice de ciclo máximo, 30 * como rodadas anteriores será gasto a partir da direita superior para a direita inferior do actual colunas, após o elemento de coluna 31 é * * / 32 para ( int K = i + 1;. K <linha-I; K ++ ) { 33 é result.add (Matrix [K] [coluna-l- I]); 34 está } 35 / * 36 * a partir do canto inferior direito para a esquerda inferior, a coluna de matriz de índice máximo é coluna-1 (a partir de 0), porque este um para a direita inferior do elemento direito de um multi-linha atrás da corrente, combinada com a anterior a roda direita 37 * gasto no canto inferior direito para a parte de trás do i-ésimo elemento, de modo que o início J = coluna-1-i- 1. 38 índice * a partir do canto inferior direito para o canto inferior esquerdo da coluna corrente durante o último ciclo de maior do que ou igual ao número de camadas, porque os ciclos anteriores gasto antes de i-1 a partir do canto inferior esquerdo para o elemento de coluna superior esquerda, de modo j> = i. 39 * tendo em conta o caso em que o número de linhas é menor que o número de colunas da matriz (por exemplo, linha 6 3), de modo que o índice máximo de linha-1 linha (número de linha inicial de 0), o ciclo de corrente, subtraindo o número de camadas não é igual ao número do ciclo corrente de camadas, 40 * Caso contrário, após a última rodada de cima da esquerda para a direita, o próximo terá que repetir o mesmo rodada da direita inferior aos elementos inferior esquerdo. 41 * preenchimento número lista resultado elemento de linha do índice de linha, subtraindo o número do ciclo máximo de camadas, porque o primeiro será gasto linhas rodadas elemento abaixo da linha de corrente a partir do canto inferior esquerdo para o canto inferior direito 42 é * * / 43 é para ( int J = Coluna I-2; (J> = I) && (= Row-I-I 1.!); J, ) { 44 é result.add (Matrix [l- Row I] [J]); 45 } 46 é / * 47 * a partir do canto inferior esquerdo para o canto superior esquerdo, a linha máxima matriz índice é fileira-1 (a partir de 0), porque é um a partir do canto inferior direito para o canto inferior esquerdo de um multi-elemento trás da coluna corrente, combinado com as etapas anteriores a partir de 48 seguindo o i-ésimo elemento * gasto inferior esquerdo ao canto superior esquerdo, de modo que o início k = linha-1-i- 1. 49 índice * a partir do canto inferior esquerdo para o canto superior esquerdo da linha actual durante o último ciclo é maior do que o número de camadas, ea linha j> diferente I =, 50 * Aqui, se o sinal de igual acabará por ter de repetir este deixou no canto superior direito de um processo o primeiro elemento, por isso k> i. 51 * tendo menor do que o número de colunas da matriz (por exemplo, 6 linhas e 3 colunas) na linha, de modo que o índice máximo da coluna de coluna-1 menos o ciclo de corrente não é igual ao número do ciclo corrente de camadas de camadas 52 *, ou um para a direita para a final no canto inferior direito, a próxima rodada terá que repetir os mesmos elementos do canto inferior esquerdo para o canto superior esquerdo. 53 * lista de resultados de enchimento número de coluna dos mesmos elementos do índice de coluna corrente de um canto superior esquerdo para o canto superior direito do início do elemento, são eu 54 é ** / 55 para ( int k = linha-2-i;! (K> i) && (coluna-1-i = i); k-- ) { 56 result.add (matriz [k] [i]); 57 } 58 } 59 retorno resultado; 60 }
1 privada estática ArrayList <Integer> list = new ArrayList <> (); 2 pública ArrayList <Integer> printMatrix01 ( int [] [] matriz) { 3 int linhas = matrix.length; 4 int colunas = matriz [0 ] .length; 5 int início = 0 ; 6 , enquanto (linhas> iniciar * 2 && colunas> iniciar * 2 ) { 7 printMatrixInCircle (matriz, filas, colunas, início); 8 iniciar ++ ; 9 } 10 return lista; . 11 } 12 é pública estática vazio printMatrixInCircle ( int [] [] Matrix, int linhas, int Colunas, int Iniciar) { 13 é // esquerda para a linha de impressão direito 14 para ( int I = Iniciar; i <Columns - Iniciar; i ++ ) { 15 List.add (Matrix [Iniciar] [I]); 16 } . 17 // cima para baixo, uma impressão 18 é para ( int J = Start + 1; J <fileiras - Iniciar;. J ++ ) { . 19 List.add ( Matrix [j] [Colunas - Start - 1. ]); 20 } 21 // direita para a esquerda na linha de impressão 22 é para ( int m = Colunas - Início - 2; m> = Iniciar && linhas - Início - 1> Iniciar;. M-- ) { 23 é List.add (matriz [linhas - . Iniciar - 1 ] [m]); 24 } 25 // a partir de uma baixa para uma impressão 26 é para ( int n-fileiras = - Iniciar - 2;.. n-> Colunas = INICIO + 1 && - Iniciar - 1> Iniciar; n-- ) { 27 List.add (Matrix [n-] [Iniciar]); 28 } 29 }
. 1 pública estática do ArrayList <Integer> printMatrix02 ( int [] [] Matrix) { 2 // como um recipiente para o resultado 3. ArrayList <Integer> = Lista nova nova <> ArrayList (); . 4 // Número de linhas do acidente variedade get 5 int row = matrix.length; . 6 o tempo (! row = 0 ) { . 7 // primeira linha da matriz para adicionar o recipiente 8. para ( int i = 0; I <Matrix [0] .length; i ++ ) { . 9 List.add (Matrix [0 ] [I]); 10 } 11. //Quando o número de linhas é igual a 1 há necessidade de proceder, e após a conclusão da impressão sobre ele na parte superior de paragem 12 é SE (Fila == 1 ) { 13 é RUPTURA ; 14 } 15 // travessia matriz de exclusão por cima da primeira fila, e rotativa e retorna esta matriz 16 matriz = reverter (Matrix); . 17 // número de linhas actualizada 18 é fileira = matrix.length; . 19 } 20 é // retorno 21 é retorno Lista; 22 é } 23 é privada estático int [] [] reverter ( int [ ] [] matriz) { 24 // número de linhas e colunas da matriz para obter 25 int linhas = matrix.length; 26 int cols = Matrix [0 ] .length; 27 // porque nós somos a primeira linha da matriz original atravessado de exclusão, em seguida, gire em uma nova matriz, então primeiro olhar para esta nova inicialização matriz 28 int [] [] = newMatrix novos novo int [cols] [-Linhas 1. ]; 29 // esta nova matriz de atribuição 30 para ( int J = -cols 1;. J> = 0; J, ) { 31 é para ( int I = 1;. eu <fileiras; i ++ ) { 32 newMatrix [. -J-cols 1] [I-1.] = Matriz [I] [J]; 33 é } 34 é } 35 //Devolve uma nova matriz 36 de retorno newMatrix; 37 [ }
teste:
1 públicas estáticos vazios principais (String [] args) { 2 int [] [] matriz = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} , {13, 14, 15, 16 }}; 3 ArrayList <inteiro> lista = printMatrix (matriz); 4 para (Inteiro inteiro: lista) { 5 System.out.print (inteiro +"" ); 6 } 7 } 8输出: 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10