class Trie {
private Trie[] children;
private boolean isEnd;
public Trie() {
children = new Trie[26];
isEnd = false;
}
public void insert(String word) {
Trie node = this;
for (int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
int index = ch - 'a';
if (node.children[index] == null) {
node.children[index] = new Trie();
}
node = node.children[index];
}
node.isEnd = true;
}
public boolean search(String word) {
Trie node = searchPrefix(word);
return node != null && node.isEnd;
}
public boolean startsWith(String prefix) {
return searchPrefix(prefix) != null;
}
private Trie searchPrefix(String prefix) {
Trie node = this;
for (int i = 0; i < prefix.length(); i++) {
char ch = prefix.charAt(i);
int index = ch - 'a';
if (node.children[index] == null) {
return null;
}
node = node.children[index];
}
return node;
}
}
class WordDictionary {
private Trie root;
public WordDictionary() {
root = new Trie();
}
public void addWord(String word) {
root.insert(word);
}
public boolean search(String word) {
return dfs(word, 0, root);
}
private boolean dfs(String word, int index, Trie node) {
if (index == word.length()) {
return node.isEnd();
}
char ch = word.charAt(index);
if (Character.isLetter(ch)) {
int childIndex = ch - 'a';
Trie child = node.getChildren()[childIndex];
if (child != null && dfs(word, index + 1, child)) {
return true;
}
} else {
for (int i = 0; i < 26; i++) {
Trie child = node.getChildren()[i];
if (child != null && dfs(word, index + 1, child)) {
return true;
}
}
}
return false;
}
}
class Trie {
private Trie[] children;
private boolean isEnd;
public Trie() {
children = new Trie[26];
isEnd = false;
}
public void insert(String word) {
Trie node = this;
for (int i = 0; i < word.length(); i++) {
char ch = word.charAt(i);
int index = ch - 'a';
if (node.children[index] == null) {
node.children[index] = new Trie();
}
node = node.children[index];
}
node.isEnd = true;
}
public Trie[] getChildren() {
return children;
}
public boolean isEnd() {
return isEnd;
}
}
import java.util.*;
class Graph {
private int V;
private List<List<Integer>> adjList;
public Graph(int vertices) {
V = vertices;
adjList = new ArrayList<>(V);
for (int i = 0; i < V; i++) {
adjList.add(new LinkedList<>());
}
}
public void addEdge(int u, int v) {
adjList.get(u).add(v);
}
public List<Integer> topologicalSort() {
Stack<Integer> stack = new Stack<>();
boolean[] visited = new boolean[V];
for (int i = 0; i < V; i++) {
if (!visited[i]) {
topologicalSortUtil(i, visited, stack);
}
}
List<Integer> result = new ArrayList<>();
while (!stack.isEmpty()) {
result.add(stack.pop());
}
return result;
}
private void topologicalSortUtil(int v, boolean[] visited, Stack<Integer> stack) {
visited[v] = true;
for (Integer neighbor : adjList.get(v)) {
if (!visited[neighbor]) {
topologicalSortUtil(neighbor, visited, stack);
}
}
stack.push(v);
}
}
public class TopologicalSortExample {
public static void main(String[] args) {
Graph graph = new Graph(6);
graph.addEdge(5, 2);
graph.addEdge(5, 0);
graph.addEdge(4, 0);
graph.addEdge(4, 1);
graph.addEdge(2, 3);
graph.addEdge(3, 1);
List<Integer> result = graph.topologicalSort();
System.out.println("Topological Sort: " + result);
}
}
public class BfsTopologicalSort {
static class Graph {
private int V;
private List<List<Integer>> adjList;
private int[] indeg;
public Graph(int vertices) {
V = vertices;
adjList = new ArrayList<>(V);
for (int i = 0; i < V; i++) {
adjList.add(new LinkedList<>());
}
indeg= new int[V];
}
public void addEdge(int u, int v) {
adjList.get(u).add(v);
indeg[v]++;
}
public List<Integer> bfsSort() {
Deque<Integer> qeue = new LinkedList<>();
for (int i = 0; i < V; i++) {
if(indeg[i]==0){
qeue.offer(i);
}
}
List<Integer> result=new ArrayList<>();
while(!qeue.isEmpty()){
int number= qeue.poll();
result.add(number);
for(Integer i: adjList.get(number)){
indeg[i]--;
if(indeg[i]==0){
qeue.offer(i);
}
}
}
return result;
}
}
public static void main(String[] args) {
Graph graph = new Graph(6);
//有向图,表示5在2之前
graph.addEdge(5, 2);
graph.addEdge(5, 0);
graph.addEdge(4, 0);
graph.addEdge(4, 1);
graph.addEdge(2, 3);
graph.addEdge(3, 1);
List<Integer> result = graph.bfsSort();
System.out.println("Topological Sort: " + result);
}
}
import java.util.PriorityQueue;
public class TopKFloats {
public static double[] findTopK(float[] nums, int k) {
if (nums == null || nums.length == 0 || k <= 0 || k > nums.length) {
return new double[0];
}
// 使用最小堆
PriorityQueue<Float> minHeap = new PriorityQueue<>(k);
// 初始阶段插入前 K 个元素
for (int i = 0; i < k; i++) {
minHeap.offer(nums[i]);
}
// 遍历剩余元素,维护最小堆
for (int i = k; i < nums.length; i++) {
if (nums[i] > minHeap.peek()) {
minHeap.poll();
minHeap.offer(nums[i]);
}
}
// 将堆中的元素转为数组
double[] result = new double[k];
for (int i = 0; i < k; i++) {
result[i] = minHeap.poll();
}
return result;
}
public static void main(String[] args) {
float[] nums = {3.1f, 1.5f, 5.2f, 7.8f, 2.4f, 4.6f, 8.9f, 6.7f};
int k = 4;
double[] result = findTopK(nums, k);
System.out.print("Top " + k + " elements: ");
for (double num : result) {
System.out.print(num + " ");
}
}
}
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
public class TopQueries {
public static void findTopQueries(String[] queries, int k) {
Map<String, Integer> queryCount = new HashMap<>();
// 哈希统计
for (String query : queries) {
queryCount.put(query, queryCount.getOrDefault(query, 0) + 1);
}
// 使用最小堆
PriorityQueue<Map.Entry<String, Integer>> minHeap = new PriorityQueue<>(
(a, b) -> Integer.compare(a.getValue(), b.getValue())
);
// 遍历哈希表,维护最小堆
for (Map.Entry<String, Integer> entry : queryCount.entrySet()) {
minHeap.offer(entry);
if (minHeap.size() > k) {
minHeap.poll();
}
}
// 输出最热门的查询串
while (!minHeap.isEmpty()) {
Map.Entry<String, Integer> entry = minHeap.poll();
System.out.println("Query: " + entry.getKey() + ", Count: " + entry.getValue());
}
}
public static void main(String[] args) {
String[] queries = {"query1", "query2", "query3", /* ... 1000万个查询串 ... */};
int k = 10;
findTopQueries(queries, k);
}
}
int BITS_PER_WORD=32;
int WORD_OFFSET(int b){
return b/BITS_PER_WORD;
}
int BIT_OFFSET(int b){
return b%BITS_PER_WORD;
}
void setBit(int[] words, int n){
words[WORD_OFFSET(n)] |= (1<< BIT_OFFSET(n));
}
void clearBit(int[] words, int n){
words[WORD_OFFSET(n)] &= ~(1<< BIT_OFFSET(n));
}
boolean getBit(int[] words, int n){
int bit=words[WORD_OFFSET(n)] & (1<< BIT_OFFSET(n));
return bit !=0;
}
public class BitVector<T> {
private static final int NONE = 0;
private static final int SINGLE = 1;
private static final int MULTIPLE = 2;
private int[][] bitVec;
public BitVector(int size) {
int arraySize = size / 32 + ((size % 32 != 0) ? 1 : 0);
bitVec = new int[arraySize][3];
}
public void setBit(T x) {
int index = (int) x >> 5;
int bit = (int) x % 32;
if (!hasNum(x, NONE)) {
bitVec[index][NONE] |= (1 << bit);
} else if (!hasNum(x, SINGLE)) {
bitVec[index][SINGLE] |= (1 << bit);
} else if (!hasNum(x, MULTIPLE)) {
bitVec[index][MULTIPLE] |= (1 << bit);
}
}
public boolean hasNum(T x, int bitState) {
int index = (int) x >> 5;
int bit = (int) x % 32;
return ((bitVec[index][bitState] >> bit) & 1) == 1;
}
}