目录
L2-012 关于堆的判断 - 优先队列+哈希表
大顶堆:每个结点的值都大于或等于其左右孩子结点的值;
小顶堆:每个结点的值都小于或等于其左右孩子结点的值。
思路:
- 用优先队列PriorityQueue来实现小顶堆
- 把小顶堆转化为数组 并更改数组下标从1开始 这样idx/2就是父节点
- 用map存 < 结点值,下标 >
- 逐步实现四个查询步骤即可 详见代码
拓展知识点:
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt(),m=sc.nextInt();
Queue<Integer>q=new PriorityQueue<>();
Map<Integer,Integer> mp=new HashMap<>();
String s;
for(int i=0;i<n;i++)
q.offer(sc.nextInt());
//把优先队列(小顶堆)转化到数组
Integer[] t=q.toArray(new Integer[n]);
int[] a=new int[n+1]; //因为索引从1开始 所以是n+1
int cnt=1;
//修改数组索引从1开始 这样idx/2就是父结点
for(int i=0,j=1;i<n;i++)
a[j++]=t[i].intValue();
for(int i=1;i<=n;i++)
{
mp.put(a[i],cnt);
cnt++;
}
sc.nextLine(); //接收回车
while(m-->0)
{
boolean f=false;
s=sc.nextLine();
String[] str=s.split(" ");
if(s.indexOf("root")!=-1)
{
int root=Integer.parseInt(str[0]);
if(mp.get(root)==1) f=true;
}else if(s.indexOf("siblings")!=-1)
{
int l=Integer.parseInt(str[0]);
int r=Integer.parseInt(str[2]);
l=mp.get(l);
r=mp.get(r);
if(l/2==r/2) f=true;
}else if(s.indexOf("parent")!=-1)
{
int parent=Integer.parseInt(str[0]);
int child=Integer.parseInt(str[5]);
if(mp.get(child)/2==mp.get(parent)) f=true;
}else{
int child=Integer.parseInt(str[0]);
int parent=Integer.parseInt(str[5]);
if(mp.get(child)/2==mp.get(parent)) f=true;
}
if(f) System.out.println("T");
else System.out.println("F");
}
}
}
L1-002 打印沙漏 - 20
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String ch=sc.next();
//求最大层数
int max;
for(int i=1;;i++)//上半部分的星号数=层数的平方 则沙漏星号总数=层数平方*2-1
if(i*i*2-1>n)
{
max=i-1;//因为跳出循环时 比最大层数多1 所以要-1
break;
}
int res=n-max*max*2+1;
//打印上半部分
int kong=0;
for(int i=max;i>=1;i--)
{
for(int j=0;j<kong;j++) System.out.print(" ");
for(int j=0;j<i*2-1;j++) System.out.print(ch);
kong++;
System.out.println();
}
//打印下半部分
kong-=2;
for(int i=2;i<=max;i++)
{
for(int j=0;j<kong;j++) System.out.print(" ");
for(int j=0;j<i*2-1;j++) System.out.print(ch);
kong--;
System.out.println();
}
System.out.print(res);
}
}
L1-003 个位数统计 - 15
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
String s=sc.next();
int[] a=new int[10];
for(int i=0;i<s.length();i++)
{
char c=s.charAt(i);
a[c-'0']++;
}
for(int i=0;i<10;i++)
if(a[i]>0) System.out.println(i+":"+a[i]);
}
}
L1-007 念数字 - 10
s.charAt(i)=='-'
equals是用于字符串的比较
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
String[] a={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
String res;
String s=sc.next();
boolean f=false;
for(int i=0;i<s.length();i++)
{
if(f) System.out.print(" ");
f=true;
if(s.charAt(i)=='-') System.out.print("fu");
else System.out.print(a[s.charAt(i)-'0']);
}
}
}