C语言-经典例题掌握

文章目录

  • 经典例题掌握
  • 一.月份打印
  • 二.字母大小写转换
  • 三.字符串中的单词进行倒排并打印
  • 四.二分查找
  • 五.错误的集合
  • 六.整数转换
  • 总结

    一.月份打印

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!!

 

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值