1..编程在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,用空格来分隔单词。
char str[] = "Duke is Duck Frank is handsome";
int length = 0;//存储当前单词的长度
int maxLength = 0;//存储最长单词长度
int maxIndex = 0;//存储最长单词开始的位置
int i = 0;//循环变量初始化
while (str[i] != '\0') {//遍历字符
if (str[i] != ' ') {
//如果取到的不是空格
length++;//单词长度加1.
} else {
//获取到的是空格的时候进行比较
if (length > maxLength) {
maxLength = length;
maxIndex = i - length;//记录单词开始位置
}
length = 0;//将单词长度清零, 计算新单词长度
}
i++;//循环变量增量!!!!!!!!!!!!!!!!!!!!!
}
//如果最后一个单词是最长单词,不会遇到空格,则不会与Maxlength比较,所以我们只需要在循环外部比较一次即可.
if (length > maxLength) {
maxLength = length;
maxIndex = i - length;
}
//
for (int i = maxIndex; i < maxIndex + maxLength; i++) {
printf("%c", str[i]);
}
2.耶稣有13个门徒,其中有一个是出卖耶稣的叛徒, 请用排除法找出这位叛徒:13个人围坐一圈,从第一个开始报数:1, 2,3,1,2,3......报数为3的退出报数, 最后剩下的一位就是叛徒, 请确定谁是叛徒.
//1.如何描述13个人?定义数组
//2.如何报数?定义一个变量count记录报数
//3.一旦报数为3,做什么处理?
//4.如何剔除一个人? 将该元素置0.
//5.表示当前活着的人数? 定义变量number.
//6.采用while循环(不知道循环多少次),循环条件number > 1.
//7.如何循环报数? 如果 i 为13,就转到第一个人继续报数.
int a[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int count = 0;
int number = 13;
int i = 0;
while (number > 1) {
if (a[i] != 0) {
count++;
}
if (count == 3) {
a[i] = 0;
number--;
count = 0;
}
i++;
if (i == 13) {
i = 0;
}
}
//对数组遍历, 找出活着的人
for (int j = 0; j < 13; j++) {
if (a[j] > 0) {
printf("当前活着的人是%d", a[j]);
}
}
3.归并排序.随机生成十个元素两个数组, 分别进行升序排序,然后将排完序的数组归并的另外一个数组中
int a[10] = {0};
int b[10] = {0};
//给a数组赋值[20-40]
for (int i = 0; i < 10; i++) {
a[i] = arc4random() % (40 - 20 + 1) + 20;
printf("%d ", a[i]);
}
printf("\n");
//排序a
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
printf("\n");
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
printf("\n");
//b数组赋值
for (int i = 0; i < 10; i++) {
b[i] = arc4random() % (40 - 20 + 1) + 20;
printf("%d ", b[i]);
}
printf("\n");
//b数组排序
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - 1 - i; j++) {
if (b[j] > b[j + 1]) {
int temp1 = b[j];
b[j] = b[j + 1];
b[j + 1] = temp1;
}
}
}
printf("\n");
for (int i = 0; i < 10; i++) {
printf("%d ", b[i]);
}
printf("\n");
//合并的数组c中
int i = 0;//标示数组 a 中元素的下标
int j = 0;//标示数组 b 中元素的下标
int c[20] = {0};
int k = 0;//标示数组 c 中元素的下标
while (i < 10 && j < 10) {
//此时,数组A与数组B都没有完全放入数组C中
if (a[i] > b[j]) {
c[k] = b[j];
k++;
j++;
}else {
c[k++] = a[i++];
}
}
//假设A中元素没有放入完毕
while (i < 10) {
c[k++] = a[i++];//将数组A中剩余的元素放入数组C中
}
//假设B中元素没有放入完毕
while (j < 10) {
c[k++] = b[j++];//将数组B中剩余的元素放入数组C中
}
//输出数组c
for (int k = 0; k < 20; k++) {
printf("%d ", c[k]);
}
4.有1000000个数,每个数取值范围都是0~999999. 找出重复的数,以及重复的次数.
//分析:数的取值范围与数组中元素的个数的下标数字相对应, 随机下标,下标重复的次数就是对应数重复的次数.先以10为例
int a[10] = {0};//0~9取值范围
int ran = 0;//接收每次的随机值
for (int i = 0; i < 10; i++) {
ran = arc4random() % 10;//随机下标
a[ran]++;//将下标对应的元素值加1
}
printf("\n");
for (int i = 0; i < 10; i++) {
if (a[i] > 1) {
printf("%d 重复 %d次\n", i, a[i]);
}
}
//以此类推
//当范围是[10-19]时
int a[10] = {0};//0~9取值范围
int ran = 0;//接收每次的随机值
for (int i = 0; i < 10; i++) {
ran = arc4random() % (19 - 10 + 1) + 10;//随机下标
printf("%d ", ran);
a[ran - 10]++;//将下标对应的元素值加1
}
printf("\n");
for (int i = 0; i < 10; i++) {
if (a[i] > 1) {
printf("%d 重复 %d次\n", i + 10, a[i]);
}
}
//范围是[17-19] 10个数
int a[3] = {0};
int ran = 0;
for (int i = 0; i < 10; i++) {
ran = arc4random() % (19 - 17 + 1) + 17;
printf("%d ", ran);
a[ran - 17]++;
}
printf("\n");
for (int i = 0; i < 3; i++) {
if (a[i] > 1) {
printf("%d 出现 %d\n", i + 17, a[i]);
}
}
//[30-50] 20个数
int a[21] = {0};
int ran = 0;
for (int i = 0; i < 20; i++) {
ran = arc4random() % (50 - 30 + 1) + 30;
printf("%d ", ran);
a[ran - 30]++;
}
printf("\n");
for (int i = 0; i < 21; i++) {
if (a[i] > 1) {
printf("%d 出现 %d\n", i + 30, a[i]);
}
}
5.随机生成一个三维数组,编程求深度的平均值,保存在一个二维数组中
/*
int a[3][4][3] = {0};
for (int i = 0; i < 3; i++) {
printf("------------第%d层-----------\n", i + 1);
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 3; k++) {
a[i][j][k] = arc4random() % (40 - 20 + 1) + 20;
printf("%d ", a[i][j][k]);
}
printf("\n");
}
printf("\n");
}
int b[4][3] = {0};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
b[i][j] += a[k][i][j];
}
printf("%.2f ", b[i][j] * 1.0 / 3);
}
printf("\n");
}
6.找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没鞍点),打印出有关信息。
int a[3][4] = {0};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
a[i][j] = 1;//arc4random() % (40 - 20 + 1) + 20;
printf("%d ", a[i][j]);
}
printf("\n");
}
//遍历数组中的每个元素,验证每个元素是否是鞍点.
int count = 0; //用来记录鞍点的个数
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
//首先假定该数是该行中最大的
BOOL isMax = YES;
//验证该数是否是该行中最大的
for (int column = 0; column < 4; column++) {
if (a[i][column] > a[i][j]) {
isMax = NO; //如果不是最大的, 将isMax标识为NO.
break; //结束当前循环
}
}
if (isMax == NO) {
//如果为NO,说明不是该行中最大的,已经不满足鞍点的条件了.
continue; //直接进入下一循环
}
//先假设是该列中最小的.
BOOL isMin = YES;
//验证该数是否是该列中最小的.
for (int row = 0; row < 3; row++) {
if (a[row][j] < a[i][j]) {
isMin = NO;
break;
}
}
if (isMin == NO) {
continue;
}
count++;
printf("row:%d,column:%d = %d\n", i + 1, j + 1, a[i][j]);
}
}
if (count == 0) {
printf("没有鞍点");
}