用两个栈实现队列
template <typename T> class CQueue{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
}
template <typename T> void CQueue<T>::appendtail(const T& element){
stack1.push(element);
}
template<typename T> T CQueue<T>::deleteHead(){
if(stack2.size() <= 0){
while(stack1.size() > 0){
stack2.push(stack1.top());
stack1.pop();
}
}
if(stack2.size() == 0)
throw exception("queue is empty");
T head = stack2.top();
stack2.pop()
return head;
快排
int Partition(int data[], int length, int start, int end){
if(data == NULL || length <= 0 || start < 0 || end >= length)
throw exception("Invalid Parameters");
int index = RandomInRange(start, end);
swap(&data[index], &data[start]);
int small = start - 1;
for(int index = start; index < end; index ++){
if(data[index] < data[end]){
small++;
if(small != index)
swap(&data[small], &data[index]);
}
}
small++;
swap(&data[small], &data[end]);
return small;
}
void QuickSort(int data[], int length, int start, int end){
if(start == end)
return;
int index = Partition(data, length, start, end);
if(index > start)
QuickSort(data, length, start, index - 1);
if(index < end)
QuickSort(data, length, index + 1, end);
}
年龄排序
void SortAges(int ages[], int length){
if(ages == NULL || length <= 0)
return;
const int oldestAge = 99;
int timesOfAge[oldestAge + 1];
for(int i = 0; i <= oldestAge; i++)
timesOfAge[i] = 0;
for(int i = 0; i < length;i ++){
int age = ages[i];
if(age < 0 || age > oldestAge)
throw exception("Age out of range");
tiemsOfAge[age]++;
}
int index = 0;
for(int i = 0; i < oldestAge; i++){
for(int j = 0; j < timesOfAge[i];j++){
ages[index++] = i;
}
}
}
旋转数组的最小数字
int Min(int* numbers, int length){
if(numbers == NULL || length <= 0)
throw new std::exception("Invalid Parameters");
int index1 = 0;
int index2 = length - 1;
int indexMid = index1;
while(numbers[index1] > numbers[index2]){
if(index2 - index1 == 1){
indexMid = index2;
break;
}
indexMid = (index1 + index2)/2;
if(numbers[index1] == numbers[index2] && numbers[index1] == numbers[indexMid])
return MinInOrder(numbers, index1, index2);
if(numbers[indexMid] <= numbers[index2])
index2 = indexMid;
else if(numbers[indexMid] >= numbers[index1])
index1 = indexMid;
}
return numbers[indexMid];
}
递归与循环
int AddFrom1ToN_Recursive(int n){
return n <= 0 ? 0 : n + AddFrom1ToN_Recursive(n - 1);
}
int AddFrom1ToN_Iterative(int n){
int result = 0;
for(int i = 0; i < n; i++)
result += i;
return result;
}
斐波那契数列
long long Fibonacci(int n){
if(n <= 0)
return 0;
if(n == 1)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
使用解法避免重复计算
long long Fibonacci(int n){
int result[2] = {0, 1};
if(n < 2)
return result[n];
long long fibNMinusOne = 1;
long long fibNMinusTwo = 0;
long long fibN = 0;
for(int i = 2; i <= n;i++){
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
二进制中1的个数
int NumberOf1(int n){
int count = 0;
while(n){
if(n & 1)
count++;
n = n>>1;
}
return count;
}
int NumberOf1(int n){
int count = 0;
unsigned int flag = 1;
while(flag){
if(n & flag)
count++;
flag = flag << 1;
}
return count;
}
int NumberOf1(int n){
int count = 0;
while(n){
count++;
n = (n - 1) & n;
}
return count;
}
数值的整数次方
double Power(double base, int exponent{
double result = 1.0;
for(int i = 1; i < exponent;i++)
result *= base;
return result;
}