算法题练习(二)------哈夫曼树,比较奇数与偶数个数,查找一个数组的第K小的数
2018-01-06 10:59
387 查看
题目:哈夫曼树
题目:比较奇数与偶数个数
题目:查找一个数组的第K小的数,注意同样大小算一样大
/** *使用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 **/
相关文章推荐
- 剑指offer-算法题练习:part15 调整数组顺序使奇数位于偶数前面
- 算法设计:将一个数组分为奇数、偶数左右两个部分,要求时间复杂度为O(n)
- 已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左边,将偶数放在数组的右边。要求时间复杂度为O(n)。
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 假设一个数组A[n]数据均为整形,设计一个O(n)的算法,实现将所有奇数放在数组左侧,所有偶数放在右侧
- 算法题:将一个数组中所有奇数放前面和偶数放后面(不开辟新的内存空间)
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- 【每天一道算法题】给定一个存放整数的数组,要求数组左边为奇数,右边为偶数
- 【练习】输入一个已经按升序排序过的数组和一个数字sum,在数组中查找两个数,使得它们 的和正好是输入的那个数字sum,要求时间复杂度为O(n)
- 将一个数组的奇数和偶数分开.c
- 数据结构和算法之数组奇数、偶数分离
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于偶数前面
- 华为:对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放,且输出数组第一位放奇数
- js写一个方法,求一个数组中的最大奇数和最小偶数,并求他们的和,如果一个数不存在则返回null。
- 将一个数组中奇数放左边偶数放右边,不用考虑数字的相对位置
- 程序员面试题精选100题(29)-调整数组顺序使奇数位于偶数前面[算法]
- 算法题目---调整数组顺序使奇数位于偶数前面
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 给定一个数组,奇数全排在前面,偶数全排在后面
- 程序员面试题精选100题(29)-调整数组顺序使奇数位于偶数前面[算法]