第三十二天(1):面试算法题

用两个栈实现队列

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;
}
发布了182 篇原创文章 · 获赞 101 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/lancecrazy/article/details/100973752