企业网站一般内容包括哪些,网址seo优化排名,文化市场经营主体,触屏版网站模板前言
本篇博客还是为大家分享一些C语言的OJ题目#xff0c;如果你感兴趣#xff0c;希望大佬一键三连。多多支持。下面进入正文部分。
题目1竞选社长 分析#xff1a;本题要求我们输入一串字符#xff0c;并且统计个数的多少#xff0c;那么我们可以通过getchar函数来获…前言
本篇博客还是为大家分享一些C语言的OJ题目如果你感兴趣希望大佬一键三连。多多支持。下面进入正文部分。
题目1竞选社长 分析本题要求我们输入一串字符并且统计个数的多少那么我们可以通过getchar函数来获取字符
#includestdio.h
int main()
{int ch 0;int flag 0;while (((ch getchar()) ! 0) ch ! EOF){if (ch A){flag;}if (ch B){flag--;}}if (flag 0){printf(A\n);}else if (flag 0){printf(B\n);}else{printf(E\n);}return 0;
}
这里大家来看代码注意while循环的停止条件根据题目要求当遇到字符0时程序停止这里的flag相当于一个标志物用来反映字符的个数变化当然大家也可以使用计数器来统计这里因人而异使用自己习惯的方法就可以。
题目2 移除元素 分析拿到这道题大家可能会有一种思路就是创建一个新数组然后进行判断判断结束后将符合条件的元素再插入到新数组这种想法其实是正确的但是很可惜本题不能用这样的方法因为题目要求不能使用额外的数组空间这就意味着我们是不能创建新数组的所以本题就需要采取其他做法
那么对于这道题还有什么其他做法呢?这里就要为大家介绍一个重要的方法——双指针法
双指针也称为快慢指针顾名思义我们需要创建两个指针变量在本题中我们可以创建src,dst两个变量我们可以让src先走然后判断它指向的值与val是否相等如果相等src如果不相等那么要先进行赋值将src指向的值赋给dst指向的值然后再让两个变量同时向后移动一位当src超过数组的范围时这个时候停止判断这时你会发现dst的值就是删除后的数组的长度所以说到这里代码基本也就出来了大家来看下面的代码。
int removeElement(int* nums, int numsSize, int val)
{int src 0;int dst 0;while (src numsSize){if (nums[src] val){src;}else{nums[dst] nums[src];src;dst;}}return dst;
}
大家来看这段代码这里的逻辑就是我上面所说的代码整体并不难重点要理解这种思想。
题目3 最高分数 分析本题要求我们来求三个数中的最大值那么我们可以运用三目操作符来解决本题。大家来看下面的代码
#includestdio.h
int main()
{int a 0;int b 0;int c 0;while (~scanf(%d%d%d, a,b,c)){int max a b ? a : b;max max c ? max : c;printf(%d, max);}return 0;
}
大家可以看到本题运用三目操作符很容易解决我们只需进行两两比较就可以得到最大值。这里大家要注意使用while来实现多组输入。
那么问题来了本题还有没有其他做法如果题目要求的不止3个数字呢面对这个问题我们就无法使用三目操作符进行解决了这个时候我们就需要使用排序的知识在我们学过的排序中追简单的就是冒泡排序所以本题的另一种解法如下
int test(int arr[],int a)
{int i 0;for (i 0; i a-1; i){int j 0;int flag 1;for (j 0; j a - i - 1; j){if (arr[j] arr[j 1]){flag 0;int tmp arr[j];arr[j] arr[j 1];arr[j 1] tmp;}}if (flag 1)break;}return arr[0];
}
#includestdio.h
int main()
{int arr[3] { 0 };int i 0;for (i 0; i 3; i){scanf(%d, arr[i]);}int ret test(arr, 3);printf(%d, ret);return 0;
} 大家来看这里我分装了一个函数里面实现的就是冒泡排序的逻辑在主函数中我们创建了数组去存储我们输入的成绩然后将数据交给函数进行排序最终我们需要返回的就是最大值关于冒泡排序大家可以关注我前面发表的关于指针的文章里面详细介绍了冒泡排序。
题目4 判断元音还是辅音 分析本题要求我们来判断输入的字母是元音还是辅音那么我们需要利用数组先将所给的元音字母存储起来然后我们在遍历数组进行判断
#includestdio.h
int main()
{int ch 0;char arr[] AaEeIiOoUu;while ((ch getchar()) ! EOF)//这里注意多组输入运用getchar来输入字母{int i 0;for (i 0; i 10; i)//遍历数组{if (arr[i] ch){printf(Vowel\n);break;//判断是元音直接跳出循环}}if (i 10)//i10说明遍历完所有元音字母都没有匹配的说明输入的是辅音字母{printf(Consonant\n);}getchar();//去除每个字符后的\n}return 0;
}
这里大家注意看上面的代码注释即可理解本题的解法。
这里还想给大家拓展一下上面我们用getchar来处理了\n那么下面还有另一种方法来处理大家来看
区别就在于循环条件那里我们在%c前面加上空格会消除掉前面所有的空白字符并读取下一个字符所以这里我们可以用这种方式来代替getchar。
#includestdio.h
int main()
{char ch 0;char arr[] AaEeIiOoUu;while (scanf( %c,ch) ! EOF)//这里注意多组输入运用getchar来输入字母{int i 0;for (i 0; i 10; i)//遍历数组{if (arr[i] ch){printf(Vowel\n);break;//判断是元音直接跳出循环}}if (i 10)//i10说明遍历完所有元音字母都没有匹配的说明输入的是辅音字母{printf(Consonant\n);}}return 0;
}
题目5 包含9的数字 分析本题要求我们找出1~2019中含有9的数字那么我们要先产生1~2029之间的数字然后进行判断
#includestdio.h
int main()
{int i 0;int count 0;for (i 1; i 2019; i){int m i;while (m 0){if (m % 10 9){count;break;}else{m / 10;}}}printf(%d, count);return 0;
} 这里大家可以看到我们使用for循环产生了1~2019之间的数字下面我们只需要判断最后一位是否为9即可如果最后一位是9那么计数器1反之我们将最后一位去除掉将其后一位作为最后一位再次进行判断。
题目6 有序序列合并 分析本题我们需要将两个数组进行合并我们的方法是每次让i下标和j下标对应值进行比较谁小就打印谁同时i下标往后走。
#include stdio.hint main()
{int n 0;int m 0;int arr1[1000] {0};int arr2[1000] {0};//输入scanf(%d %d, n, m);int i 0;for(i0; in; i){scanf(%d, arr1[i]);}for(i0; im; i){scanf(%d, arr2[i]);}//处理int j 0;i 0;while(in jm){if(arr1[i] arr2[j]){printf(%d , arr1[i]);i;}else{printf(%d , arr2[j]); j;}}if(i n){for(; jm; j){printf(%d , arr2[j]);}}else{for(; in; i){printf(%d , arr1[i]);}}return 0;
}
题目7 单身狗1 分析本题要求我们找出不成对出现的数字那么这里有一个奇妙的解法就是运用操作符去进行实现我们知道一个数与0进行异或运算得到的是自己而自己与自己进行异或运算得到的是0所以本题我们只需要将数组中的所有数组挨个进行异或就可以找出那个“单身狗”。
#includestdio.h
int main()
{int i 0;int sum 0;int arr[] { 1,2,3,4,5,1,2,3,4 };int sz sizeof(arr) / sizeof(arr[0]);for (i 0; i sz; i){sum ^ arr[i];}printf(%d, sum);return 0;
}