1.下面代码的执行结果是( )
cpp
#include <stdio.h>
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
char *str3 = "hello bit.";
char *str4 = "hello bit.";
if(str1 == str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 == str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
A.str1 and str2 are same str3 and str4 are same
B.str1 and str2 are same str3 and str4 are not same
C.str1 and str2 are not same str3 and str4 are same
D.str1 and str2 are not same str3 and str4 are not same
str1和str2是两个数组,数组的操作方式是将右边常量字符串的内容拷贝进来,所以他们是两个空间,只是内容相同,所以str1 != str2。而str3和str4是两个指针,编译器在处理的时候,会将相同的常量字符串做成同一个地址,所以,str3和str4指向的是同一个常量字符串,所以str3 == str4,故选C。
2.使用指针打印数组内容。写一个函数打印arr数组的内容,不使用数组下标,使用指针。arr是一个整形一维数组。
cpp#include <stdio.h> int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; //在这里完成代码 // 分析:因为数组中存储的元素类型是int类型的,因此只要给一个int的指针,依次取索引数组中的每个元素即可 int* p = arr; // 数组名代表数组首元素的地址 for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) { printf("%d ", *p); // *p: 取到p所指向位置的元素 ++p; // 获取p的下一个位置 } return 0; }
3.实现一个对整形数组的冒泡排序
cpp/* 思路: 遍历数组,对数组中相邻的两个元素进行比较,如果需要升序,前一个数据大于后一个数据时,交换两个位置上的数据,直到所有的数据比较完,此时,最大的数据已经放在数组的末尾。 除最大数据已经排好序外,其余数据还是无需,对剩余数据采用与上述类似的方式进行处理即可 */ void BubbleSort(int array[], int size) { // 外层循环控制冒泡排序的趟数 // size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略 for(int i = 0; i < size-1; ++i) { // 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾 for(int j = 1; j < size-i; ++j) { if(array[j-1] > array[j]) { int temp = array[j-1]; array[j-1] = array[j]; array[j] = temp; } } } } /* 优化:如果某次冒泡结束后,序列已经有序了,后面剩余元素的冒泡可以省略 */ void BubbleSort(int array[], int size) { // 外层循环控制冒泡排序的趟数 // size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略 for(int i = 0; i < size-1; ++i) { int isChange = 0; // 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾 for(int j = 1; j < size-i; ++j) { if(array[j-1] > array[j]) { int temp = array[j-1]; array[j-1] = array[j]; array[j] = temp; isChange = 1; // 如果本次冒泡进行数据交换了,说明本次还是无序的,就将isChange设置为1 } } // 如果本次冒泡中,元素没有交换,则本次开始冒泡时,数据已经有序了,后面的冒泡可以不用进行了 if(!isChange) return; } }
4.写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1 给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到DAABC
本题当然可以将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,也太费事,但是这题有一个很简单的做法:
其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。
cppint findRound(const char * src, char * find) { char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串 strcpy(tmp, src); //先拷贝一遍 strcat(tmp, src); //再连接一遍 return strstr(tmp, find) != NULL; //看看找不找得到 }
5.有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。 要求:时间复杂度小于O(N);
我们仔细分析,不难发现,对于杨氏矩阵老说,右上角和左下角的元素是有特点的。右上角的元素是一行中最大的,一列中最小的。左下角的元素是一行中最小的,是一列中最大的。所以我们可以从右上角或者左下角开始查找。比如:从右上角开始查找的时候,右上角的元素比我们要查找元素小,我们就可以去掉右上角元素所在的这一行;右上角的元素比我们要查找的元素大,我们就可以去掉右上角元素所在的这一列。然后依然找右上角的元素继续和要查找的元素与比较。这样每一次比较去掉一行或者去掉一列。这个查找效率是高于遍历数组元素的,所以时间复杂度是小于O(N),也满足题目要求。
cpp#include <stdio.h> int findnum(int a[][3], int x, int y, int f) //第一个参数的类型需要调整 { int i = 0, j = y - 1; //从右上角开始遍历 while (j >= 0 && i < x) { if (a[i][j] < f) //比我大就向下 { i++; } else if (a[i][j] > f) //比我小就向左 { j--; } else { return 1; } } return 0; } int main() { int a[][3] = { {1, 3, 5}, {3, 5, 7}, {5, 7, 9} }; //一个示例 if (findnum(a, 3, 3, 2)) { printf("It has been found!\n"); } else { printf("It hasn't been found!\n"); } return 0; }
6.杨辉三角
在屏幕上打印杨辉三角。
1
1 1
1 2 1
1 3 3 1
......
由于此题要打印整个杨辉三角的数据而非取出某一项,所以不可避免的一定是要填出每一项,没有偷懒的余地,那就老老实实的根据规律填空即可。按照题设的场景,能发现数字规律为:d[i][j] = d[i - 1][j] + d[i - 1][j - 1]。所以我们只要按照这个方法填表即可。
cppvoid yangHuiTriangle(int n) { int data[30][30] = { 1 }; //第一行直接填好,播下种子 int i, j; for (i = 1; i < n; i++) //从第二行开始填 { data[i][0] = 1; //每行的第一列都没有区别,直接给1,保证不会越界。 for (j = 1; j <= i; j++) //从第二列开始填 { data[i][j] = data[i - 1][j] + data[i - 1][j - 1]; //递推方程 } } for (i = 0; i < n; i++) //填完打印 { for (j = 0; j <= i; j++) { printf("%d ", data[i][j]); } putchar('\n'); } }