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("沒有鞍點");
}