14亿个数乱序,从中抽取一个数字,如何知道抽取的是哪个数字?

将抽取一个数字后的数组中的每个元素依次进行异或运算,结果再与1到14亿依次进行异或运算,得到的结果就是抽取的数字。
例:1~10,抽取9

System.out.println(1^2^3^4^5^6^7^8^10^1^2^3^4^5^6^7^8^9^10); 9

10亿个数取TopN

维护一个长度为N的数组arr;
先读取N个数,放入数组中,对其进行快排;
之后每次读取一个数,如果该数字小于等于arr[N-1],则丢弃;
如果该数字大于arr[N-1],则进行二分查找,数组移动,并插入。

上台阶问题

一共有n级台阶,有两种走法:一次上一层,一次上两层,问上到第n级台阶有几种上法。
假设上到第n级台阶有W(n)中上法。
W(n) = 上到第n-1级台阶,然后一次走一层 + 上到第n-2级台阶,然后一次走两层
W(n) = W(n-1) + W(n-2)

W(1) = 1
W(2) = 2
W(3) = W(1)+W(2)
W(4) = …

W(n) = W(n-1) + W(n-2)
获得一个长度为n+1的数组int[] W,W(n)表示上n级台阶有多少种上法。

合并两个有序链表

类似于归并排序的并过程
其中为新链表的头结点设计一个rootPre节点,可以避免判断if(root == null)。

  1. public class Main {
  2. public static void main(String[] args) {
  3. Node node1 = new Node(1);
  4. node1.next = new Node(5);
  5. node1.next.next = new Node(23);
  6. Node node2 = new Node(3);
  7. node2.next = new Node(4);
  8. node2.next.next = new Node(5);
  9. Node root = merge(node1, node2);
  10. while (root != null) {
  11. System.out.print(root.value + " ");
  12. root = root.next;
  13. }
  14. }
  15. private static Node merge(Node node1, Node node2) {
  16. if (node1 == null) return node2;
  17. if (node2 == null) return node1;
  18. Node rootPre = new Node(Integer.MIN_VALUE);
  19. Node currentNode = rootPre;
  20. while (node1 != null && node2 != null) {
  21. if (node1.value <= node2.value) {
  22. currentNode.next = node1;
  23. currentNode = node1;
  24. node1 = node1.next;
  25. } else {
  26. currentNode.next = node2;
  27. currentNode = node2;
  28. node2 = node2.next;
  29. }
  30. }
  31. if (node1 == null) currentNode.next = node2;
  32. else currentNode.next = node1;
  33. return rootPre.next;
  34. }
  35. }
  36. class Node {
  37. int value;
  38. Node next;
  39. public Node(int value) {
  40. this.value = value;
  41. }
  42. }