Data structure advanced training course notes and algorithm exercises
Source Code: https://github.com/MysticalGuest/DataStructure/tree/master/AdvancedJuniorTraining
题目1
1 2 3
| 我们把只包含因子2,3,5的数称为丑数。求从小到大的第1500个丑数。 -例如:6,8都是丑数,但14不是丑数,因为它包含因子7.习惯上我们把1当做丑数。 -编写尽可能高效的算法。提示:(可以用空间换时间)
|
1.1 算法设计思想
准备一个数组,初始化第1个丑数的下标0,值1;
然后1X2得到2,就是第2个丑数;
然后1X3得到3,就是第3个丑数;
不能直接1X5就是第4个丑数,因为还有一个丑数2X2=4;
所以难点就是判断中间丑数,然后存储在数组中;往下循环;
然后1X5得到5,就是第5个丑数
1.2 源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| int min_num(int n1,int n2,int n3){ int min=(n1<n2)?n1:n2; min=(min<n3)?min:n3; return min; }
void solution(long int array[]){ int i; int t2=0; int t3=0; int t5=0;
for(i=1; i<1500; i++){ while(array[t2]*2<=array[i-1]) t2++; while(array[t3]*3<=array[i-1]) t3++; while(array[t5]*5<=array[i-1]) t5++; int min=min_num(array[t2]*2, array[t3]*3, array[t5]*5); array[i]=min; } }
|
1.3 运行情况截图
题目2
2.1 算法设计思想
针对一般矩阵,先顺时针打印最外部一圈,
那么这个矩阵去掉外部一圈,内部也是一个小矩阵;
按照这样的规律,依次打印最外部一圈就可以了
2.2 源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| void PrintMatrix(int (*num)[4], int col, int row, int layer){ int i; int new_col = col - layer; int new_row = row - layer; for(i=layer; i<new_col; i++){ printf("%d ", num[layer][i]); } if(new_row>layer){ for(i=layer+1; i<new_row; i++){ printf("%d ", num[i][new_row-1]); } } if(new_col-1>layer && new_row-1>layer){ for(i=new_col-2; i>=layer; i--){ printf("%d ", num[new_col-1][i]); } } if(new_col-1>layer && new_row-1>layer+1){ for(i=new_row-2; i>layer; i--){ printf("%d ", num[i][layer]); } } }
|
2.3 运行情况截图
题目3
1 2 3
| 设二维数组B[0..m-1][0..n-1]的数据在行、列方向上都按从小到大的顺序有序, 且x在B中存在。试设计一个算法,找出x在B数组中的位置i,j。 要求比较的次数不超过m+n
|
3.1 算法设计思想
第一个循环(最多4次):
将要定位的元素与每一行的最后一个元素比较,如果小于等于最后一个元素就结束循环,此时的i值就是元素的行坐标;
第二次循环(最多5次):
将要定位的元素与每一列的所有元素比较,如果小于等于这个值,就结束循环,此时的j值就是元素的列坐标
3.2 源代码
1 2 3 4 5 6 7 8 9
| int matrix[4][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}, i, j; for(i=0; i<4; i++){ if(obj <= matrix[i][4]) break; } for(j=0; j<5; j++){ if(obj <= matrix[i][j]) break; }
|
3.3 运行情况截图