文章目录
- 经典例题掌握
- 一.月份打印
- 二.字母大小写转换
- 三.字符串中的单词进行倒排并打印
- 四.二分查找
- 五.错误的集合
- 六.整数转换
- 总结
一.月份打印
KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
输入描述:
多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
输出描述:
针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。
方法一:
这里我们要知道,闰年2月有29天,平年28天,所以我们要进行闰年的判断,这里我们有两种方法,第一种就是直接列举,把每个月份都列举出来,平年与闰年只有2月不同,如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int m, y, days;
while (scanf("%d %d", &y, &m) == 2) {
switch (m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: days = 31; break;
case 4:
case 6:
case 9:
case 11: days = 30; break;
}
if (((y % 100 != 0 && y % 4 == 0) || y % 400 == 0))//闰年
{
if (m == 2)
{
days = 29;
printf("%d\n", days);
}
else
printf("%d\n", days);
}
else//不是闰年
{
if (m == 2)
{
days = 28;
printf("%d\n", days);
}
else
printf("%d\n", days);
}
}return 0;
}
方法二:
#include<stdio.h>
int main()
{
int y, m;
//我们把一年的12个月的天数都放在数组里
int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
//多组输入
while (scanf("%d %d", &y, &m) != EOF)
{
//天数对应数组的下标,数组的下标就是月份-1,比如,一月对应的就是days[0]
int day = days[m - 1];
//判断闰年
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
{
//如果是闰年,二月就+1天
if (m == 2)
{
day += 1;
}
}
printf("%d\n", day);
}
return 0;
}
利用数组,列举所有月份天数,数组下标就是月份-1,如果是闰年,就二月对应(days[1]=28)+1即29天
二、字母大小写转换
完成字母大小写转换,有一个字符,判断它是否为大写字母,如果是,将它转换成小写字母;反之则转换为大写字母。
输入描述:
多组输入,每一行输入一个字母。
输出描述:
针对每组输入,输出单独占一行,输出字母的对应形式
#include<stdio.h>
int main()
{
char letter = '0';
//多组输入
while (scanf("%c", &letter) != EOF)
{
if ((letter >= 'a') && (letter <= 'z'))
{
letter -= 32;
printf("%c\n", letter);
}
else if ((letter >= 'A') && (letter <= 'Z'))
{
letter += 32;
printf("%c\n", letter);
}
}
return 0;
要熟悉ASCLL码表!!!
三.字符串中的单词进行倒排并打印
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
#include<stdio.h>
#include<string.h>
//我们使用一个指针数组,保存每个单词的起始地址,最后再逆序输出就可以了
//用'\0'把单词进行分割。
int main()
{
char str[10001] = { 0 };
int row = 0;//指针数组的下标。
while (gets(str) > 0)
{
char* ptr = str;
char* world[10000] = { NULL };
while (*ptr != '\0')
{
//如果是字母字符,则是单词的起始地址
if ((*ptr >= 'A' && *ptr <= 'Z') || (*ptr >= 'a' && *ptr <= 'z'))
{
world[row++] = ptr;
while (*ptr != '\0' &&
((*ptr >= 'A' && *ptr <= 'Z') || (*ptr >= 'a' && *ptr <= 'z')))
{
ptr++;
}
}
*ptr = '\0';
ptr++;
}
int i = 0;
for (i = row - 1; i >= 0; i--)
{
printf("%s ", world[i]);
}
printf("\n");
}
return 0;
}
方法二:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[100][22];
int i=0;
int x;
while(1)
{
x=scanf("%[a-z|A-Z]",str[i]);//输入一个单词
if (getchar()=='\n') break;
if(x) i++;//一个单词一行
}
for(int j=i;j>=0;j--)
{
printf("%s ",str[j]);
}
return 0;
}
四.二分查找
编写代码在一个整形有序数组中查找具体的某个数
要求:找到了就打印数字所在的下标,找不到则输出:找不到。
#include<stdio.h>
int main()
{
//定义查找的数
int k = 0;
//定义整型数组
int arr[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 };
int left = 0;//左下标
//右下标为总元素个数-1,因为下标从0开始
int right = sizeof(arr) / sizeof(arr[0]) - 1;
printf("请输入要查找的数:->");
scanf("%d", &k);
//左下标始终小于右下标,当相等时就说明找到那个数了
while (left <= right)
{
//中间坐标
int mid = (right + left) / 2;
//中间坐标对应元素<要求的,那么新的查找区域左边坐标就变成了mid+1,右边不变
if (arr[mid] < k)
{
left = mid + 1;
}
//中间坐标对应元素>要求的,那么新的查找区域右边坐标就变成了mid-1,左边不变
if (arr[mid] > k)
{
right = mid - 1;
}
//左右坐标相等,说明确定这个值了
if (arr[mid] == k)
{
printf("找到了,下标为%d", mid);
break;//找到结果,中止循环
}
}
//左下标大于右下标说名这个数是不存在的
if (left > right)
{
printf("找不到");
}
return 0;
}
注意如果不是有序的数组,就先进行排序然后再二分查找!!!
五.错误的集合
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
来源:力扣(LeetCode)
int* findErrorNums(int* nums, int numsSize, int* returnSize) {
*returnSize = 2;
int *arr = (int *)calloc(numsSize + 1, sizeof(int));
int *ret = (int *)calloc(*returnSize , sizeof(int));
int cur_sum=0;
int old_sum = 0;
for(int i=0;i<numsSize;i++)
{
if(arr[nums[i]] == 1){
ret[0] = nums[i];
}
arr[nums[i]] = 1;
old_sum += i + 1;
cur_sum += nums[i];
}
ret[1] = old_sum -(cur_sum - ret[0]);
free(arr);
return ret;
}
六.整数转换
整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。
int count_ab(int tmp)
{
int count = 0;
for(int i=0;i<32;i++)
{
if((tmp >> i)&1)
count++;
}
return count;
}
int convertInteger(int A, int B){
return count_ab(A^B);
}
总结
共同努力,一起拿到好offer!!