难题记录
1.【数学题】计算1~某个数内,含有1的个数
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
ArrayList<Integer> dp = new ArrayList<>();
int i = 1;
int count = 0;
while(n / i != 0){
//当前位置i,当前点cur,当前点之前high,当前点之后low
int cur = (n / i) % 10;
int high = n / (i * 10);
int low = n - (n / i) * i;
//每到一个位置,判断当前位置为1的可能个数(注意,1是累加的,如11表示出现2次)
//规律:当前点为0时,高位*当前位置;当前点为1时,比0时多低位计算;当前点为2-9时,(高位+1)*当前位置。
if(cur == 0){
count += high * i;
}else if(cur == 1){
count += high * i + low + 1;
}else{
count += (high + 1)*i;
}
i *= 10;
}
return count;
}
}
2.【最小生成树】
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
class Edge{
int from, to, val;
public Edge(int from, int to, int val) {
this.from = from;
this.to = to;
this.val = val;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while (t-- > 0){
String[] line1 = br.readLine().split(" ");
int n = Integer.parseInt(line1[0]);//除0以外的顶点数
int m = Integer.parseInt(line1[1]);//除0以外的其他顶点关系数
ArrayList<Edge> edges = new ArrayList<>(); //存储所有的边
String[] line2 = br.readLine().split(" ");
for (int i = 1; i <= n; i++)
edges.add(new Edge(0, i, Integer.parseInt(line2[i-1])));
for (int i = 0; i < m; i++){
String[] line = br.readLine().split(" ");
edges.add(new Edge(Integer.parseInt(line[0]), Integer.parseInt(line[1]), Integer.valueOf(line[2])));
}
// 1.将边按照权值大小排序
edges.sort(Comparator.comparingInt(o -> o.val));
int p[] = new int[n+1];
// 2.设计父节点记录表,尚未找到父节点则值为本身
for (int i = 0; i <= n; i++)
p[i] = i;
int ans = GenTree(m+n, n+1, edges, p);
System.out.println(ans);
}
}
private static int findParent(int i, int[] p){
if(i!=p[i])
p[i]=findParent(p[i], p);
return p[i];
}
private static int GenTree(int len, int n, ArrayList<Edge> edges, int[] p){
int sum=0,num=0;
// 3.循环遍历边(从小到大),依此判断是否可连接(父节点)
for(int i=0;i<len && num < n-1;i++){
int ps=findParent(edges.get(i).from, p);
int pe=findParent(edges.get(i).to, p);
if(pe!=ps){
p[pe]=ps;
num++;
sum+=edges.get(i).val;
}
}
return sum;
}
}
3.