解题实战
【1】小白上楼梯
小白正在上楼梯,楼梯有n阶台阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算小白有多少种走完楼梯的方式。
/*小白上楼梯*/
int smallwhite(int n){//n表示台阶数
if(n==0) return 1;
if(n==1) return 1;
if(n==2) return 2;
return smallwhite(n-1)+smallwhite(n-2)+smallwhite(n-3);
}
【2】旋转数组的最小数字
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <cmath>
using namespace std;
/*旋转数组的最小数字(二分法)*/
int arrmin(int arr[], int begin, int end){
/*最小的那个数一定在无序的一边*/
if(arr[begin] < arr[end]) return arr[begin];//没有旋转的情况
if(begin + 1 >= end) return arr[end];//由于旋转,最小值总是在右边
int mid = begin + ( (end - begin) >> 1);
if(arr[mid] >= arr[begin]){//右边无序
arrmin(arr, mid, end);
}
else{//左边无序
arrmin(arr, begin, mid);
}
}
int main() {
int arr[5] = {3,4,5,1,2};
cout << arrmin(arr,0,4);
}
【3】在有空字符串的有序字符串数组中查找
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <cmath>
using namespace std;
/*在有空字符串的有序字符串数组中查找*/
int indexOf(string str[], string p, int length){
int begin = 0;
int end = length - 1;
while(begin <= end){
int indexOfmid = begin + ( (end - begin) >> 1 );
while(str[indexOfmid] == ""){
indexOfmid ++;
if(indexOfmid > end)
return -1;
}
if(str[indexOfmid].compare(p) > 0)
end = indexOfmid - 1;
else if(str[indexOfmid].compare(p) < 0)
begin = indexOfmid + 1;
else
return indexOfmid;
}
return -1;
}
int main() {
string str[8] = {"a", "", "ac", "", "ad", "b", "", "ba"} ;
cout << indexOf(str, "abc", 8);
}
【4】最长连续递增子序列
思路:设置一前一后两个指针,前指针先不动,后指针向后扫描,如果是递增的则接着扫描,直到扫到第一个非递增元素,记录此时前后指针之间的距离,记为length,并保留前指针的位置信息。然后重置前后指针,使得前指针指向刚才扫描到的那个非递增元素,重复上面工作直到结束,找到length最长的那个前指针位置信息并输出。
/*最长连续递增子序列*/
int MaxLength(int arr[], int N){
int front = 0;
int end = 1;
int length = 1;
int Max_len = 0;
int Max_index;
int i;
for(i=0; i<N; i++){
if(arr[end] > arr[i]){
end ++;
length ++;
}
else{
if(length > Max_len){
Max_len = length;
Max_index = front;
}
front = end;
end ++;
length = 1;
}
}
for(i=0; i<Max_len; i++){
cout << arr[Max_index+i] << " ";
}
}
【5】高效求a的n次幂算法
/*快速设计一个高效的求a的n次幂的算法*/
int pow(int a, int n){
if(n == 0) return 1;
int res = a;
int ex = 1;
//能翻
while( (ex << 1) <= n ){
//翻
res = res * res;
//指数*2
ex <<= 1;
}
//不能翻
//差n-ex方没有乘到结果里面
return res * pow(a, n-ex);
}