1. Resolva o problema da matriz espiral de ordem n
[Descrição do problema] Crie uma matriz espiral de ordem n e imprima-a.
[Descrição da entrada] A entrada contém vários casos de teste, cada caso de teste é uma linha e contém um número inteiro positivo n (1≤n≤50) e insira 0 para indicar o fim.
[Descrição da saída] Cada caso de teste produz n linhas, cada linha inclui n inteiros e os inteiros são separados por um espaço.
[Amostra de entrada] 4
[Amostra de saída] 1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
public class Solution1 {
/**
* 目前已知最优雅的写法
* Left-Right-Top-Down螺旋模板
*/
public int[][] CreateSpiral(int n) {
int[][] res = new int[n][n];
int L = 0;
int R = n - 1;
int T = 0;
int D = n - 1;
int index = 1;
int remain = n * n;
while (remain > 0) {
for (int i = L; i <= R && remain > 0; i++) {
res[T][i] = (index++);
remain--;
}
T++;
for (int i = T; i <= D && remain > 0; i++) {
res[i][R] = (index++);
remain--;
}
R--;
for (int i = R; i >= L && remain > 0 ; i--) {
res[D][i] = (index++);
remain--;
}
D--;
for (int i = D; i >= T && remain > 0; i--) {
res[i][L] = (index++);
remain--;
}
L++;
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
int n = sc.nextInt();
if (n == 0) {
break;
}
int[][] res = new Solution1().CreateSpiral(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(res[i][j] + " ");
}
System.out.println();
}
}
}
}
2. Resolva o problema do número da sorte
[Descrição do problema] Depois de aprender diferentes bases, Xiao Ming pegou alguns números e começou o jogo. Xiao Ming sabe que, na vida diária, usamos os números decimais com mais frequência e, nos computadores, os números binários também são usados com muita frequência. Agora, para um número x, Xiao Ming definiu duas funções f (x) e g (x). f (x) representa a soma dos dígitos em cada dígito depois que o número x é escrito em decimal. Por exemplo, f (123) = 1 + 2 + 3 = 6. g (x) representa a soma dos números em cada dígito depois que o número x é escrito em binário. Por exemplo, a representação binária de 123 é 1111011, então g (123) = 1 + 1 + 1 + 1 + 0 + 1 + 1 = 6. Xiao Ming descobriu que para alguns números inteiros positivos x satisfaz f (x) = g (x), ele chamou esses números de números da sorte. Agora ele quer saber quantos números da sorte são menores ou iguais a n?
【Insira a descrição】 n (n≤100000).
[Descrição da entrada] O número de números da sorte menor ou igual a n.
【Amostra de entrada】 21
【Amostra de entrada】 3
public class Solution2 {
/**
* 每一个数都判断是否是LuckyNumber即可,非常简单~
*/
public int getLuckyNumber(int n) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
cnt += (f(i) == g(i) ? 1 : 0);
}
return cnt;
}
private int f(int n) {
if (n < 10) {
return n;
}
return n % 10 + f(n / 10);
}
private int g(int n) {
if (n < 2) {
return n;
}
return n & 1 + g(n >> 1);
// 位运算永远的神
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(new Solution2().getLuckyNumber(n));
}
}
3. Resolva o problema da sequência do palíndromo
[Descrição do problema] Se uma sequência digital for igual à sequência original após a inversão, essa sequência digital é chamada de sequência de palíndromo. Por exemplo, {1,2,1}, {15,78,78,15}, {11,2,11} são sequências de palíndromos e {1,2,2}, {15,78,87,51} , {112,2,11} não é uma sequência de palíndromo. Agora forneça uma sequência de números, permitindo uma operação de conversão: selecione quaisquer dois números adjacentes, remova esses dois números da sequência e insira a soma desses dois números na posição antes dos dois (insira apenas um e). Encontre o número mínimo de operações necessárias para uma determinada sequência para transformá-la em uma sequência de palíndromo.
[Descrição da entrada]: A entrada é de duas linhas, a primeira linha é o comprimento da sequência n (1≤n≤50), a segunda linha é n item inteiro [i] (1≤ item [i] ≤1000) na sequência , com um espaço Separado.
[Descrição de saída]: envia um número, indicando o número mínimo de conversões necessárias.
【Amostra de entrada】 4
1 1 1 3
【Amostra de saída】 2
public class Solution3 {
/**
* 每次计算最外面的一层,递归内层
*/
public int trans2palindrome(int[] arr, int L, int R) {
if (L >= R) {
return 0;
}
int res = 0;
int sumL = arr[L++];
int sumR = arr[R--];
while (L <= R) {
if (sumL < sumR) {
sumL += arr[L++];
res++;
} else if (sumL > sumR) {
sumR += arr[R--];
res++;
} else {
break;
}
}
return res + trans2palindrome(arr, L, R);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int[] arr = new int[len];
for (int i = 0; i < len; i++) {
arr[i] = sc.nextInt();
}
System.out.println(new Solution3().trans2palindrome(arr, 0, len -1));
}
}
4. Resolva o problema do jogo de dados
[Descrição do problema] O jogador decide o número de passos dados de acordo com o número de pontos do dado, ou seja, um passo pode ser dado quando o número de dados for 1, dois passos podem ser dados quando o número for 2 e n passos pode ser obtido quando o número é n. Peça ao jogador para atingir a enésima etapa (n ≤ o número máximo de dados e a única maneira de rolar os dados), quantas maneiras de rolar os dados no total.
[Descrição da entrada]: A entrada inclui um número inteiro n (1≤n≤6).
[Descrição da saída]: Produz um número inteiro, o que significa o número de maneiras de lançar os dados.
[Amostra de entrada]: 6
[Amostra de saída]: 32
public class Solution4 {
/**
* 回溯的最简单最初始版本———不需要记录路径,仅需要记录个数
*/
public int ThrowDice(int n) {
return traceBack(n);
}
private int traceBack(int remain) {
if (remain == 0) {
return 1;
}
int sum = 0;
for (int i = 1; i <= 6 && i <= remain; i++) {
sum += traceBack(remain - i);
}
return sum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(new Solution4().ThrowDice(n));
}
}
⭐️ Esta deve ser a solução Java mais bonita em toda a rede> _ <