Skip to content

Commit 977e186

Browse files
committed
[A] 添加TOPK思路;[A] 华为机试题
1 parent ac055b2 commit 977e186

2 files changed

Lines changed: 75 additions & 13 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.bruis.algorithminjava.algorithm.huawei;
2+
3+
import java.util.Scanner;
4+
5+
/**
6+
* @author LuoHaiYang
7+
*
8+
* 题目描述:输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。
9+
*
10+
* 输入描述: 输入一个整数(int类型)
11+
*
12+
* 输出描述: 这个数转换成2进制后,输出1的个数
13+
*
14+
* 实例1:
15+
*
16+
* 输入:5
17+
* 输出:2
18+
*
19+
*/
20+
public class Question01 {
21+
22+
/**
23+
* 笨办法
24+
* @param args
25+
*/
26+
public static void main(String[] args) {
27+
28+
// 巧妙法,通过二进制位运算
29+
Scanner in = new Scanner(System.in);
30+
31+
int count = in.nextInt(), result = 0;
32+
while (count > 0) {
33+
if ((count & 1) > 0) {
34+
result++;
35+
}
36+
count = count >> 1;
37+
}
38+
System.out.println(result);
39+
/*
40+
笨办法
41+
Scanner scanner = new Scanner(System.in);
42+
int input = scanner.nextInt();
43+
char[] bytes = Integer.toBinaryString(input).toCharArray();
44+
int result = 0;
45+
for (char c : bytes) {
46+
if (c == '1') {
47+
result++;
48+
}
49+
}
50+
System.out.println(result);
51+
*/
52+
}
53+
54+
}

src/main/java/com/bruis/algorithminjava/algorithm/leetcode/array/TopKFrequentElements.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ public class TopKFrequentElements {
1414

1515
/**
1616
*
17-
*
17+
* 桶排序
1818
*
1919
*/
2020
public int[] topKFrequent(int[] nums, int k) {
21+
List<Integer> res = new ArrayList<>();
22+
2123
if (nums == null || nums.length < 2) {
2224
return nums;
2325
}
@@ -32,23 +34,29 @@ public int[] topKFrequent(int[] nums, int k) {
3234
}
3335
}
3436

35-
List<Integer> result = new ArrayList<>();
36-
37-
Set<Map.Entry<Integer, Integer>> entries = count.entrySet();
38-
39-
for (Map.Entry<Integer, Integer> entry : entries) {
40-
if (entry.getValue() > k) {
41-
result.add(entry.getKey());
37+
List<Integer>[] list = new List[nums.length];
38+
for (int key : count.keySet()) {
39+
// 让频率作为下标
40+
int i = count.get(key);
41+
if (list[i] == null) {
42+
list[i] = new ArrayList<>();
4243
}
44+
// key表示的是元素
45+
list[i].add(key);
4346
}
4447

48+
for (int i = list.length - 1; i >= 0 && res.size() < k; i--) {
49+
if (list[i] == null) {
50+
continue;
51+
}
52+
res.addAll(list[i]);
4553

46-
int[] res = new int[result.size()];
47-
48-
for (int i = 0; i < result.size(); i++) {
49-
res[i] = result.get(i);
5054
}
51-
return res.length > 0 ? res : nums;
55+
int[] result = new int[res.size()];
56+
for (int i = 0; i < res.size(); i++) {
57+
result[i] = res.get(i);
58+
}
59+
return result;
5260
}
5361

5462
public static void main(String[] args) {

0 commit comments

Comments
 (0)