赞
踩
目录
大顶堆:每个结点的值都大于或等于其左右孩子结点的值;
小顶堆:每个结点的值都小于或等于其左右孩子结点的值。
思路:
- 用优先队列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");
- }
-
- }
- }
- 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);
- }
- }
- 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]);
- }
- }
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']);
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。