#include <iostream> #include <vector> #include <algorithm> using namespace std; void SortData( int data[], int n) { for( int i = 0; i < n-1; i++) { if(i % 2 == 0) // 偶数 { if(data[i] > data[i+1]) { int tmp = data[i]; data[i] = data[i+1]; data[i+1] = tmp; } } else // 奇数 { if(data[i] < data[i+1]) { int tmp = data[i]; data[i] = data[i+1]; data[i+1] = tmp; } } } } int main() { int data[10]; for( int i = 0; i < 10; i++) { data[i] = i+1; } random_shuffle(data, data+10); for( int i = 0; i < 10; i++) { cout << data[i] << " "; } cout << endl; SortData(data, 10); for( int i = 0; i < 10; i++) { cout << data[i] << " "; } cout << endl; return 0; }2. 一串N个元素(不一定是整数),若存在某一个元素出现次数在一半以上,则成为“众数”,现在给你一串N个元素,问怎么快速并且节省时间地判断众数是否存在,如果存在找出这个元素。
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool HasMorehalfNum( int data[], int n, int &num) { int count = 0, cur = 0; bool isNew = false; for( int i = 0; i < n; i++) { isNew = false; if(count == 0) { cur = data[i]; count = 1; isNew = true; } else if(data[i] == cur) { count ++; } else if(data[i] != cur) { count --; } } if(cout >= 0 && !isNew) { num = cur; return true; } return false; } int main() { int data[] = {2, 3, 2, 2, 5, 4, 2, 2, 1, 2}; int num = -1; if(HasMorehalfNum( data, 10, num)) { cout << "The Number is: " << num << endl; } else { cout << "The Number is not exist!" << endl; } return 0; }3. 给定两个整数数组a[],b[]和一个公式a^6-a^2*b^2-b^4 = 2009(注意,是a的6次方,a的2次方),要求设计一个算法快速
再继续想,这个递归什么时候收敛呢?当然一个case就是相等的值出现, 如果不出现等到这个n==1的时候也就结束了。照着这样的思路,我们比较容易写出如下的代码,当然边界的值需要自己思量一下,前面的想法只是想法而已。
int find_median_equal_length( int a[], int b[], int length) { if (length == 1) return a[0]; int i = length / 2; if (a[i] == b[i]) return a[i]; else if (a[i] < b[i]) return find_median_equal_length( &a[i], &b[0], length-i); else return find_median_equal_length( &a[0], &b[i], length-i); }
马上有人说那不定长的怎么办呢?一样的,我们还是来画个图看看:(我的画图水平肯定提高了)
第二题:假设两个有序数组长度不等,一样的求出中位数
一样的,我们还是把这个两个数组来比较一下,不失一般性,我们假定B数组比A数组长一点。A的长度为n, B的长度为m。比较A[n/2]和B[m/2]时候。类似的,我们还是分成几种情况来讨论:int find_median_random_length( int a[], int lengtha, int b[], int lengthb) { int ma = lengtha/2; int nb = lengthb/2; int l = ma <= nb ? ma: nb; if (lengtha == 1) { if (lengthb%2==0) { if (a[0] >= b[nb]) return b[nb]; else if (a[0] <= b[nb-1]) return b[nb-1]; return a[0]; } else return b[nb]; } else if (lengthb == 1) { if (lengtha%2==0) { if (b[0] >= a[ma]) return a[ma]; else if (b[0]<=a[ma-1]) return a[ma-1]; return b[0]; } else return a[ma]; } if ( a[ma] == b[nb] ) return a[ma]; else if ( a[ma] < b[nb] ) return find_median_random_length(&a[ma],lengtha-l,&b[0],lengthb-l); else return find_median_random_length(&a[0],lengtha-l,&b[nb],lengthb-l); }在一些特定的case下面测试了一下,结果还是正确的,下面是用的testcase
int _tmain(int argc, _TCHAR* argv[]) { int a[] = {1,2,3,6,8} ; int b[] = {6,7,8,9,10}; std::cout<<"median for equal length is : "<<find_median_equal_length(a, b, sizeof(a)/sizeof(a[0]))<<std::endl; ; int c[] = {1,3,5,7,9,11} ; int d[] = {2,4,6,8,10,12}; std::cout<<"median for equal length is : "<<find_median_equal_length(c, d, sizeof(c)/sizeof(c[0]))<<std::endl;; int A[]={1,3,5,7,8,9,10}; int B[]={2,4,6,10,11,12,13,14,17,19,20}; int sizeA = sizeof(A)/sizeof(int); int sizeB = sizeof(B)/sizeof(int); std::cout<<"median : "<<find_median_random_length(A,sizeA,B,sizeB)<<std::endl;; int C[] = {1, 2, 3, 4, 5, 6, 7}; int D[] = {5, 6, 7, 8, 9}; std::cout<<"median : "<<find_median_random_length(C,sizeof(C)/sizeof(C[0]),D,sizeof(D)/sizeof(D[0]))<<std::endl;; system("pause"); return 0; }5. 36匹马,6个跑道,求最少跑几次可以得到前三名,跑的时候不能记录具体的时间,只能记录相对顺序。
第一名对应的一组中,挑选出第一轮比赛中的二三名,第二名对应的组中,挑选第一轮比赛中的第二名,这样就有六匹马再赛依次,即可的得出前3名。
6. 有100层楼的一个楼房,另外有一种特殊的玻璃杯子,可以站在任何一层的阳台上往地面扔杯子,现在可以确定从某一层把杯子扔下去就会碎,低于这层的地方扔下去肯定不会碎,但是没有人知道这个层数确切是多少,有人说是5,有人说是50,就像一个传输。现在只给你两个杯子,需要确定那个杯子扔下去会碎的临界层数是多少,问,让你使用一种选择层数的策略使得最坏情况下确定那个临界层数需要扔杯子的次数最小,注意没有摔坏的杯子可以再扔。
答案转自:http://blog.csdn.net/taylor_tao/article/details/7084467
#include <iostream> #include <vector> #include <algorithm> using namespace std; int mypartition( int data[], int start, int end) { int pivot = data[end]; int k = start - 1; for( int i = start; i < end; i++) { if(data[i] < pivot) { ++k; int tmp = data[k]; data[k] = data[i]; data[i] = tmp; } } ++k; int tmp = data[k]; data[k] = data[end]; data[end] = tmp; return k; } void quicksort( int data[], int start, int end) { if( start < end) { int pivot = mypartition( data, start, end); quicksort( data, start, pivot-1); quicksort( data, pivot+1, end); } } int main() { int data[] = {2, 3, 2, 2, 5, 4, 2, 2, 1, 2}; for( int i = 0; i < 10; i++) { cout << data[i] << " "; } cout << endl; quicksort(data, 0, 9); for( int i = 0; i < 10; i++) { cout << data[i] << " "; } cout << endl; return 0; }8. 有一个岔道口两条路,一条通往A(那里的人只讲真话),另外一条通往B(那里的人只说谎),这事两条路上各走过来一个人都是当地人,且知道对方的来历,你只能问他们其中的一个人一个问题,对方只会回答"是"或“不是”,怎么才能知道那条路通往A
9. 输入n,生成(2n+1)阶矩阵;例如,输入1 生成
7 8 9
6 1 2
5 4 3 。即生成螺旋矩阵的程序。
#include <iostream> #include <vector> #include <algorithm> #include <fstream> using namespace std; #define N 10 int ar[N][N]; void SpiralArray(int size) { int a = size*2+1; //保证边长为奇数 int y = a / 2,x = a / 2; //从中心点开始 for ( int i = 1; i <= a*a; i++) { if ( x <= a-y-1 && x >= y) // { ar[y][x]=i; x++; } else if (x>a-y-1&&x>y) { ar[y][x]=i; y++; } else if (x>a-y-1&&x<=y) { ar[y][x]=i; x--; } else if (x<=a-y-1&&x<y) { ar[y][x]=i; y--; } } } int main() { SpiralArray(1); for(int i = 0; i < 2*1+1; i++) { for(int j = 0; j < 2*1+1; j++) { cout << ar[i][j] << " "; } cout << endl; } cout << endl; return 0; }
By Andy @ 2013年10月21日