您的位置:首页 > 其它

算法题练习(二)------哈夫曼树,比较奇数与偶数个数,查找一个数组的第K小的数

2018-01-06 10:59 387 查看
题目:哈夫曼树

/**
*使用java的priorityQueue(java.util.PriorityQueue)
*功能:priorityQueue通过小顶堆实现啊,可以保证每次从堆中取出的元素都是最小元素
*构造:priorityQueue<Integer> priorityQueue = new priorityQueue();
*方法:add(E a)    poll()....size()   scanner.hasNext()    scanner.nextInt()
*思路:   1)读入第一行数据
2)创建priorityQueue,并依据第一行数据读入第二行,定义num变量
3)当priorityQueue不为空时执行:
1:取出queue中前两个数
2:num与这两个数相加
3:把加完的数存回priorityQueue
4)退出循环后输出num
**/
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main{
public static void main(String arg[]){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt()){
int number = scanner.nextInt();
PriorityQueue<Integer> priorityqueue = new PriorityQueue(number);
for(int i=0;i<number;i++){
priorityqueue.add(scanner.nextInt());
}
int output = 0;
while(priorityqueue.size()>1){
int a = priorityqueue.poll();
int b = priorityqueue.poll();
output +=a+b;
priorityqueue.add(a+b);
}
System.out.println(output);

}
}
}
/**
*问题:1)priorityqueue.add(a+b),一开始写成了priorityqueue.add(output),导致输出比实际大
2) while(priorityqueue.size()>1)  一开始写成 while(priorityqueue.size() != 0)
当queue中只有一个元素时就应该停止取出元素,因为此时队列中只有一个元素,即要输出的结果元素
3)priorityqueue.add(scanner.nextInt()  一开始写成priorityqueue.add(scanner.hasNext()
刚开始换到java语言不习惯
**/


题目:比较奇数与偶数个数

/**
*使用的类:Scanner   Integer数组
*思路:1)当检测到还有下一行时执行:
1:读入一个数字n
2:定义一个长度为n的Integer数组,连续读入n个数
3:定义int numOdd  int numEven
4:遍历数组,遇到偶数numOdd++,遇到级数numEven++
5:遍历完成后做判断并输出NO/YES
**/
import java.util.Scanner;

public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
int Odd = 0;
int Even = 0;
for(int i =0 ;i < n; i++){
int temp = scanner.nextInt();
if(temp%2 == 0){
Even++;
}
else{
Odd++;
}
}
if(Even>Odd){
System.out.println("NO");
}else{
System.out.println("YES");
}
}
}
}
/**
错误:1)测试用例:
35 7 35 25 42 90 88 7 21 86 79 85 38 85 66 93 11 28 60 37 7 86 31 76 38 58 6 85 94 61 76 98 92 69 24 100 26 63 72 98 51 21 93 38 65 41 46 9 58 36 77 51 62 92 1 28 84 45 88 10 75 31 83 51 6 13 8 66 18 88 34 61 59 92 30 36 92 14 43 2 37 78 72 63 43 46 13 35

对应输出应该为:

YES

你的输出为:

NO
原因:如果偶数比奇数多,输出NO,否则输出YES。也就是说奇数与偶数一样多则输出YES,所以要先判断Even>Odd比较合理

**/


题目:查找一个数组的第K小的数,注意同样大小算一样大

/**
*类: Scanner Integer数组  TreeSet
*思路:1)读入 n
2)创建一个Set
3)往Set中打入n个数
4)读入k
5)输出set中第k个元素
**/
import java.util.*;

public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt()){
int n = scanner.nextInt();
Set<Integer> set = new TreeSet<Integer>();
for(int i=0;i<n;i++){
set.add(scanner.nextInt());
}
int k = scanner.nextInt();
Iterator<Integer> it = set.iterator();
for(int i=0;i<k-1;i++){
it.next();
}
System.out.println(it.next());
}
}
}
/**
题目中要求没有重复,一开始想的是使用priorityqueue,但本题显然set更合适
要求排除重复,优先使用set
**/


/**
*类: Scanner Integer数组  TreeSet
*思路:1)读入 n
2)创建一个Set
3)往Set中打入n个数
4)读入k
5)输出set中第k个元素
**/
/**
*这是使用priorityqueue的解法
**/
import java.util.*;

public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
for (int i = 0; i < n; i++) {
pq.add(scanner.nextInt());
}
int k = scanner.nextInt();
int pri = pq.peek();
if (pq.size() == 1) {
System.out.println(pri);
}
int i = 0;
Integer num = pri;
while (i < k-1) {
num = pq.poll();
if (!num.equals(pri)) {
i++;
}
pri = num;

}
System.out.println(num);

}
}
}
/**
题目中要求没有重复,一开始想的是使用priorityqueue,但本题显然set更合适
要求排除重复,优先使用set
**/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐