Diretório de artigos
treino de corrida
Link do tópico: https://www.lanqiao.cn/problems/597/learning/
Essa questão pode apenas percorrer todas as datas. Acontece que sempre usei a classe Calendar. Encontrei a
LocalDate
classe uma vez e achei muito útil. Porém, existem muitas funções cujos valores de retorno não sabem o tipo , então só posso ver o código-fonte. Encontre-o ou consulte o manual da API
package daily;
import java.time.DayOfWeek;
import java.time.LocalDate;
/**
* https://www.lanqiao.cn/problems/597/learning/
*
* @author Jia
*
*/
public class day3_31_1 {
public static void main(String[] args) {
LocalDate left = LocalDate.of(2000, 1, 1);
LocalDate right = LocalDate.of(2020, 10, 1);
int ans = 0;
while (left.compareTo(right) <= 0) {
DayOfWeek dayOfWeek = left.getDayOfWeek();// 星期几
int dayOfMonth = left.getDayOfMonth();// 每月的日期
if (dayOfWeek.getValue() == 1 || dayOfMonth == 1) {
ans += 2;
} else {
ans += 1;
}
left = left.plusDays(1);// 下一天
}
System.out.println(ans);
}
}
linha reta
Link do tópico: https://www.lanqiao.cn/problems/1449/learning/
Esta questão é realmente insensível. O método que usei quando fiz isso pela primeira vez foi y = kx + by = kx + bS=k x+b , e então a fórmula direta calculakkk , esqueci a precisão de double, cometi um erro e depois considerei a equação da linha reta comoA x + B y + C = 0 Ax+By+C=0A x+Por _+C=0 pode ser feito, mas é apenas contraABC ABCHouve um problema quando A B C passou na pontuação e, finalmente, foi corrigido.
A ideia é relativamente simples, ou seja, encontrar uma linha reta para quaisquer dois pontos e, em seguida, desduplicar a linha para obter o resultado final. A dificuldade é como desduplicar. Se você calcular a inclinação diretamente, ela falhará devido a problemas de precisão. Há também uma idéia. É armazenar o numerador e denominador da inclinação e deslocamento, e dividi-los para o mais simples. Esta é uma maneira de pensar. Naturalmente, não haverá problemas de precisão.
hashCode
Como Set em java precisa ser reescrito e dois métodos se você quiser usar uma classe personalizada, éequals
muito lento escrevê-lo sozinho. O Eclipse possui teclas de atalho que podem ser construídas diretamente. Na interface de escrita de código, clique com o botão direito do mouse - > Source->Selecione dois na caixa. Isso pode economizar muito tempo. Em outras palavras, existe o toString, que pode ser muito conveniente para depurar o programa. Caso contrário, ele imprimirá vários endereços.
package daily;
import java.util.HashSet;
import java.util.Set;
/**
* https://www.lanqiao.cn/problems/1449/learning/
*
* @author Jia
*
*/
public class day3_31_2 {
public static void main(String[] args) {
int xEnd = 20;
int yEnd = 21;
int[][] points = new int[xEnd * yEnd][2];
int index = 0;
// 构造点集
for (int i = 0; i < xEnd; i++) {
for (int j = 0; j < yEnd; j++) {
points[index][0] = i;// x
points[index][1] = j;// y
index++;
}
}
// 两点构造一条直线,得到该直线 Ax + By + C = 0 的表达式,在构造函数中会对 ABC 除以他们的最大公约数进行约分
Set<Line1> lineSet = new HashSet<>();
for (int i = 0; i < points.length; i++) {
for (int j = i + 1; j < points.length; j++) {
int a1 = points[i][0];
int b1 = points[i][1];
int a2 = points[j][0];
int b2 = points[j][1];
int A = a2 - a1;
int B = b2 - b1;
int C = a2 * b1 - a1 * b2;
lineSet.add(new Line1(A, B, C));
}
}
System.out.println(lineSet.size());
}
}
class Line1 {
int A;
int B;
int C;
public int gcd(int a, int b) {
// 当有一个数为0的时候,直接返回另一个数字
if (a == 0 || b == 0) {
return a == 0 ? b : a;
}
return a % b == 0 ? b : gcd(b, a % b);
}
public Line1(int a, int b, int c) {
super();
int gcd = 1;
gcd = gcd(a, b);
gcd = gcd(gcd, c);
A = a / gcd;
B = b / gcd;
C = c / gcd;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + A;
result = prime * result + B;
result = prime * result + C;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Line1 other = (Line1) obj;
if (A != other.A)
return false;
if (B != other.B)
return false;
if (C != other.C)
return false;
return true;
}
}
decimais recorrentes
Link do tópico: https://www.lanqiao.cn/problems/1051/learning/
Uh, se você fizer essa pergunta sozinho, estima-se que será violento, mas sinto que pode haver a mesma pergunta de precisão que a perguntada acima, e então pesquisei o método de conversão na Internet:
1. Converta decimais recorrentes puros em frações
Método: Reescreva a dízima periódica pura em uma fração, o numerador é um número composto de números em uma seção recorrente; os números no denominador são todos 9 e o número de 9s é o mesmo que o número de números na seção recorrente , e finalmente o número pode ser reduzido.
2. Converta decimais de ciclo misto em frações
Método: Reescreva a dízima periódica mista como uma fração, e o numerador é a diferença obtida subtraindo-se o número composto pelos números da parte decimal na seção recorrente menos os números compostos pela parte não circular da parte decimal; o primeiros dígitos do denominador são 9, e os últimos dígitos são O número de dígitos é 0, o número de 9s é o mesmo que os dígitos da seção de loop, e o número de 0s é o mesmo que os dígitos do seção sem loop.
inscrição:
13,12323…=13+(123-1)/990=6496/495
0,123123…=123/999
0,12333…=(123-12)/900=111/900=37/300
Para unificar as características das conclusões acima é: se o número de dígitos na seção do ciclo mais o número de dígitos não reciclados é total, então o denominador é o número de dígitos 9+0, o número de 9 é igual ao número de dígitos na seção do ciclo, e o número de 0 é igual ao número de dígitos não reciclados. O número de dígitos; o numerador é igual a = o número que não se repete após o ponto decimal mais o número formado por a primeira seção de repetição, menos o número que não se repete após o ponto decimal.
Aqui você pode apenas ver o exemplo e a conclusão final e depois traduzi-lo em código da seguinte maneira
package daily;
import java.util.Scanner;
/**
* https://www.lanqiao.cn/problems/1051/learning/
*
* @author Jia
*
*/
public class day3_31_3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int p = sc.nextInt();
int q = sc.nextInt();
String num = sc.next();
sc.close();
int len_buxunhuan = p - 1;
int len_xunhuan = q - p + 1;
int buxunhuan = len_buxunhuan == 0 ? 0 : Integer.parseInt(num.substring(0, p - 1));
int xunhuan = Integer.parseInt(num.substring(p - 1, q));
int fenmu = 0;
for (int i = 0; i < len_xunhuan; i++) {
fenmu = fenmu * 10 + 9;
}
for (int i = 0; i < len_buxunhuan; i++) {
fenmu = fenmu * 10;
}
int fenzi = (int) (buxunhuan * Math.pow(10, len_xunhuan) + xunhuan - buxunhuan);
int gcd = gcd(fenzi, fenmu);
System.out.println(fenzi / gcd + " " + fenmu / gcd);
}
/**
* 求最大公约数
*
* @param a
* @param b
* @return
*/
private static int gcd(int a, int b) {
return a % b == 0 ? b : gcd(b, a % b);
}
}
Transposição do cartão
Link do tópico: https://www.lanqiao.cn/problems/125/learning/
Esta pergunta pode ser feita diretamente por bfs. Eu estava entorpecido na aula de manhã, e não consigo escrever metade dela. Posso terminar à noite.
package daily;
import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Set;
/**
* https://www.lanqiao.cn/problems/125/learning/
*
* @author Jia
*
*/
public class day3_31_4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[][] chs = new char[2][3];
for (int i = 0; i < chs.length; i++) {
String str = sc.nextLine();
for (int j = 0; j < str.length(); j++) {
chs[i][j] = str.charAt(j);
}
}
sc.close();
Deque<char[][]> queue = new LinkedList<>();
Set<String> set = new HashSet<>();
set.add(chs2Str(chs));
queue.addFirst(chs);
int[] nextRow = {
0, 1, 0, -1 };
int[] nextCol = {
1, 0, -1, 0 };
int ans = 0;
while (!queue.isEmpty()) {
int size = queue.size();
ans++;
while (size > 0) {
char[][] chArr = queue.removeLast();
for (int i = 0; i < nextRow.length; i++) {
// todo
}
}
}
}
/**
* 字符数组转化成字符串
*
* @param chs
* @return
*/
private static String chs2Str(char[][] chs) {
String str = "";
for (int i = 0; i < chs.length; i++) {
for (int j = 0; j < chs[0].length; j++) {
str += chs[i][j];
}
}
return str;
}
}