【C++】剑指Offer上的题目1-9
2015-07-20 11:36
363 查看
// test_little_0714.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> #include <random> #include "time.h" using namespace std; int main(){ return 0; } /* //斐波那契数列的两种方法,非递归的效率要高很多 long long Fibonacci(int N){ if (N <= 0) return 0; if (N == 1) return 1; long long arr1,arr2,arr3; arr1 = 0; arr2 = 1; int times = 2; while(times<=N){ arr3 = arr1 + arr2; arr1 = arr2; arr2 = arr3; times++; } return arr3; } long long Fibonacci_r(int N){ if (N <= 0) return 0; if (N == 1) return 1; return Fibonacci_r(N - 1) + Fibonacci_r(N - 2); } void main(){ unsigned int N = 50; auto tm1 = clock(); cout << Fibonacci(N) << endl; auto tm2 = clock(); cout << "Runtime:" << 1000 * static_cast<double>(tm2 - tm1) / CLOCKS_PER_SEC << endl; tm1 = clock(); cout << Fibonacci_r(N) << endl; tm2 = clock(); cout << "Runtime:" << 1000 * static_cast<double>(tm2 - tm1) / CLOCKS_PER_SEC << endl; getchar(); } */ /*//旋转最小序列 void move_array(int* data, int idx, int size){ int* data2 = new int[idx]; for (int i = 0; i < idx; ++i){ data2[i] = data[i]; } for (int i = idx; i < size; i++){ data[i-idx] = data[i]; } int num = size - idx; for (int i = 0; i < idx; i++){ data[i+num] = data2[i]; } delete[] data2; } void reverse(int* data, int length){ if (!data || length < 2) return; int *p1 = data; int *p2 = data+length - 1; while (p1!=p2){ int *temp = p1+( p2 - p1 +1 )/ 2; if (temp == p1 || temp == p2){ p1 = (*p1 < *p2) ? p1 : p2; } if (*temp < *p1) p2 = temp; else p1 = temp; }//二分法找到最小值 int idx = p1 - data;//最小值所在的下标位置 move_array(data, idx, length); } void main(){ int data[] = {3,4,5,6,7,1,2}; reverse(data, 7); for (int i = 0; i < 7; i++) cout << data[i] << endl; getchar(); }*/ /* //小范围的(如年龄)时间复杂度为O(n)的排序 void SortAges(int* ages,int length){ if (ages == nullptr || 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++){ ++timesOfAge[ages[i]]; } int sum = 0; for (int i = 0; i < 1 + oldestAge; i++){ if (timesOfAge[i] != 0){ sum += timesOfAge[i]; //注意这里的sum不会大于ages的长度,因为它表示的是出现的次数 ages[sum-1] = i; } } } void main(){ const int N = 10; default_random_engine eng(time(0)); uniform_int_distribution<int> gen(0, 99); int *data = new int ; for (int i = 0; i < N; ++i){ data[i] = gen(eng); cout << data[i] << endl; } cout << endl; SortAges(data, N); for (int i = 0; i < N; ++i) cout << data[i] << endl; getchar(); } */ /* //快速排序 int Partition(double* dat,int size){ double thresh = dat[0]; double temp; int i = 0; int j = size - 1; while (i!=j){ if (dat[j] <= thresh){ temp = dat[i+1]; dat[i] = dat[j]; dat[j] = temp; i += 1; } else{ j -= 1; } } dat[i] = thresh; return i; } void q_sort(double* data,int size){ if (size < 2) return; int idx = Partition(data, size); q_sort(data, idx); q_sort(data + idx +1, size - idx - 1); } void main(){ const int N = 20; default_random_engine eng(time(0)); uniform_real_distribution<double> gen(0, 10); double *data = new double ; for (int i = 0; i < N; ++i){ data[i] = gen(eng); } q_sort(data, N); //Partition(data, N); for (int i = 0; i < N; i++) cout << data[i] <<endl; delete[] data; getchar(); }*/ /* // 由前序和中序遍历结果恢复二叉树 struct treenode{ int data; treenode* left = nullptr; treenode* right = nullptr; }; int find(int* p, int size, int data){ for (int i = 0; i < size; i++){ if (p[i] == data) return i; } return -1; } treenode* construct(int *pre,int* ino,int size){ if (size < 1) return nullptr; treenode* head = new treenode; head->data = pre[0]; int idx = find(ino,size,pre[0]); //左子树的节点个数 if (idx == -1) return nullptr; int * left_pre = pre + 1; int * left_in = ino; int * right_pre = pre + 1 + idx; int * right_in = ino + 1 + idx; head->left = construct(left_pre, left_in, idx); head->right = construct(right_pre, right_in, size - idx - 1); return head; } void PreOrder(treenode*& head){ if (head){ cout << head->data << endl; if (head->left) PreOrder(head->left); if (head->right) PreOrder(head->right); } } void InOrder(treenode* &head){ if (head){ if (head->left) InOrder(head->left); cout << head->data << endl; if (head->right) InOrder(head->right); } } int _tmain(int argc, _TCHAR* argv[]) { int Preorder[] = {1,2,4,7,3,5,6,8}; int Inorder[] = {4,7,2,1,5,3,8,6}; treenode* head = construct(Preorder, Inorder, 8); PreOrder(head); cout << endl; InOrder(head); getchar(); return 0; } */
相关文章推荐
- c++之运行时类型识别
- C++四个新的类型转换操作符
- UVA11729 Commando War
- c++关于文件打开目录的问题
- C语言函数sscanf()的用法
- What's the difference between C++ and Python
- c++ 11新特性
- [C++设计模式] adapter 适配器模式
- POJ3069 Saruman's Army
- C++知识点总结(5)
- C++知识点总结(5)
- 大话设计模式C++实现-文章7章-代理模式
- [C++设计模式] command 命令模式
- c语言求最大公约数和最小公倍数
- 【C++】修改VS2013的默认堆栈大小
- 彻底搞清 C/C++中a++与++a的区别
- 步步为营(三)贪心(2)选择不相交区间
- C++ HOJ 约瑟夫问题 之 神牛代码
- C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组
- [libxml2]_[C/C++]_[使用libxml2读取分析xml文件]