====== Software Engineering ======
===== Math =====
Prime Numbers
* every positive integer can be a product of primes.
* prime factorization
* Sieve of Eratosthenes
Permutations/Combinations
* Permutations - order matters
* with repetition: lock
* n^k
* without repetition: rainbow
* n!/(n-r)!
* Combinations - order doesn't matter
* with repetition: icecream
* (n r)
* n!/r!(n-r!)
* without repetition: fruit salad
* (n+n-r r)
Bit Manipulation
* ^ XOR, ~ boolean NOT
* 0110 + 0110 is the same as 0110 * 2, shifting 0110 left by 1.
* Multiplying by 2^2 just shifts a number by n
* a ^ (~a) is all 1's
* bit shifting
* arithmetic shift
* logical shift
* circular rotate
* Uses
* boolean isPalindrome(int x)
* get bit - num & (1 << i) != 0
* set bit - num | (1 << i)
* clear bit - num & mask, mask = ~(1 << i)
* clear from MSB or 0
* powers of 2: http://en.wikipedia.org/wiki/Power_of_two
* In Java, all integer types are signed, and the "<<" and ">>" operators perform arithmetic shifts.
* Java adds the operator ">>>" to perform logical right shifts,
* but because the logical and arithmetic left-shift operations are identical, there is no "<<<" operator in Java.
===== Basic Data Structures =====
* Strings
* [[http://pastebin.com/1FAaQhTp|has repeats?]]
* Arrays
* Linked Lists
Node deleteNode(Node head, int d) {
Node n = head
if (n.data == d) {
return head.next; // moved head
}
while (n.next != null) {
if (n.next.data == d) {
n.next = n.next.next;
return head; // head didn't change
}
n = n.next;
}
return head;
}
===== Advanced Data Structures =====
* Stacks
* Queues
* Trees
* balanced or unbalanced, full and complete
* Tries - Unlike a binary search tree, no node in the tree stores the key associated with that node; instead, its position in the tree defines the key with which it is associated. All the descendants of a node have a common prefix of the string associated with that node, and the root is associated with the empty string.
* Graphs - http://pastebin.com/MtJQDqVZ
* AdjacencyList
* Matrix
* HashMap
public HashMap buildMap(Student[] students) {
HashMap map = name HashMap();
for (Student s : students) map.put(s.getId(),s);
return map;
}
If you're only interested in the keys, you can iterate through the keySet() of the map:
Map map = ...;
for (String key : map.keySet()) {
// ...
}
If you only need the values, use values():
for (Object value : map.values()) {
// ...
}
Finally, if you want both the key and value, use entrySet():
for (Map.Entry entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
One caveat: if you want to remove items mid-iteration, you'll need to do so via an Iterator (see karim79's answer). However, changing item values is OK (see Map.Entry).
===== Algorithms =====
* Recursion - take at least O(n) space, where n is depth of recursive call.
* dynamic programming caches results
* Sorting
* Searching
* Big O - http://bigocheatsheet.com/
* P - Polynomial Time
* NP - Verification is P
* NPComplete is NPHard that can be reduced to NP problem (for verification only)
* NPHard - Shortest traveling sales person
===== Design =====
4 principles of OOP
* Data Abstraction
* Encapsulation
* Inheritance
* Polymorphism
* Object-Oriented
* factory - cardgame
* singleton - restaurant
* "does it make sense to call this method, even if no Obj has been constructed yet?" If so, it should definitely be static.
* System Design
* Memory Limits
* order of appearance, hash value, random/arbitrarily
* http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
* Testing
* who
* what cases
* bounds/environmental
* failure conditions
* how to test
* manual/automated
* black/whitebox
* values
* normal
* extremes
* nulls
* strange
* troubleshooting
* Design Patterns - http://en.wikipedia.org/wiki/Software_design_pattern
[[teaching notes]]