C语言必会题目(2)

news2024/11/26 16:50:52

W...Y的主页 😊

代码仓库分享💕

今天继续分享C语言必会的题目,上一篇文章主要是一些选择题,而今天我们主要内容为编程题的推荐与讲解

准备好迎接下面的题了吗?开始发车了!!!

输入数字 n ,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3 ,则打印出 1、2、3 一直到最大的 3 位 数 999 。

用返回一个整数列表来代替打印

n 为正整数 OJ链接

OJ链接【牛客网题号: JZ17 打印从1到最大的n位数】

示例: 输入:1 返回值:[1,2,3,4,5,6,7,8,9]


首先我们要对题目进行分析,这里可以理解为n位数中最大的数字,从1开始。实际上是用一个数组来打印这些数字。那我们就得求出一共有多少数字:10^n-1个。比如:1位数10^1 - 1 2位数: 10^2 - 1 3位数: 10^3 - 1。

n在不同情况下不同,如果创建一个能兼容所有的数组会很浪费内存,所以我们使用malloc动态内存开辟解决问题。

注意:是数组下标从0开始,而数值从1开始

int* printNumbers(int n, int* returnSize ) {
*returnSize = pow(10, n) - 1; //确定最大的数字
int *arr = (int *)malloc(sizeof(int)*(*returnSize));//申请足够大小的空间
for (int i = 0; i < *returnSize; i++) {
arr[i] = i+1;//下标从0开始,而数值从1开始
}
return arr;
}

根据输入的日期,计算是这一年的第几天。输入保证年份为4位数且日期合法。

输入描述:输入一行,每行空格分割,分别是年,月,日。

输出描述:输出是这一年的第几天

OJ链接【牛客网题号: HJ73 计算日期到天数转换】 


这道题简单解法其实将每个月的天数枚举出来,然后根据当前月份向前累加满月的天数,然后再加上当前月所在的 天数。最终考虑平闰年的 2 月份区别是否增加一天。

注意:当二月份没过完时,闰年与平年的判断就没有用,不需要+1或不加,这里得用if进行判断。例如:2000年2月1日 ,虽然是闰年,但是 2月 都没走完那是不能加上闰年多出的一天的。

#include <stdio.h>

int is_leap_year(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
    return 1;
}
    return 0;
}
int main() {
    int a, b, c;
    int count = 0;
    int mouth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    while (scanf("%d %d %d", &a, &b, &c) != EOF) { // 注意 while 处理多个 case
      for(int i = 0; i < b-1; i++)
      {
        count += mouth[i]; 
      }
      count += c;
      if(b>2)
      count += is_leap_year(a);
        printf("%d\n", count);
    }
    return 0;
}

判断闰年方法:能被4整除不能被100整除或者能被400整除。

验证尼科彻斯定理,即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如: 

1^3=1

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

输入一个正整数 m(m≤100) ,将 m 的立方写成 m 个连续奇数之和的形式输出。

注意:本题含有多组输入数据。

输入描述:输入一个int整数 输出描述:输出分解后的string

OJ链接【牛客网题号: HJ76 尼科彻斯定理】

示例: 输入:6 输出:31+33+35+37+39+41


看到此题,我们必须在里面找到规律,这样才能快速解题。

首先我们可以看出尼科彻斯定理n是几,后面组成的数就有几个并且全部都是连续奇数。

这时我们就可以遍历求和来得到需要的内容,但是这样的时间复杂度太高,为了优化代码我们继续找其中规律。

能够找到第 n 个数据立方的起始奇数,从这个起始奇数开始,组成连续的n个奇数 项之和的表达式即可。比如: 3^3 的起始奇数是 7 , 则 {7, 9, 11} 3个奇数求和表达式 7 + 9 + 11 。而起始奇数有个规则: m^3 的起始奇数值等于 m * (m - 1) + 1。

能找到起始奇数就非常简单了,只需要再加n-1个奇数即可得到结果。

#include <stdio.h>
int main() {
    int m = 0;
    while(scanf("%d", &m) != EOF)
    {
        int n = m*(m-1)+1;
        char arr[1000] = {0};
        sprintf(arr, "%d", n);
        for(int i = 1 ; i < m; i++)
        {
            sprintf(arr, "%s+%d", arr, n +=2);
        }
        printf("%s", arr);
    }
    return 0;
}

打印时得输出内容的加和,所以我们将其放入字符数组中进行打印。

sprintf:将格式化数据转换成字符串,用法与printf大差不差,只是在参数中多一个转入指针(接收想转入的地址) 。

首先输入要输入的整数个数 n ,然后输入 n 个整数。输出为 n 个整数中负数的个数,和所有正整数的平均值, 结果保留一位小数。

注意: 0 即不是正整数,也不是负数,不计入计算;

本题有多组输入用例。

输入描述:首先输入一个正整数 n ,然后输入 n 个整数。

输出描述:输出负数的个数,和所有正整数的平均值。

OJ链接【牛客网题号: HJ97 记负均正】

示例: 输入: 5

1 2 3 4 5

10

1 2 3 4 5 6 7 8 9 0

输出: 0 3.0        0 5.0


这道题我们最常用的思路使用数组进行操作,但其实我们直接使用scanf捕捉数据即可,统计负数个数,以及正数格式,并且在统计正数个数的过程中求取正数总 和,最后计算得出平均数即可。需要注意的是所有数字中0是不统计在内的。

int main() {
    int n;
    while(~scanf("%d", &n)) {
    int count1 = 0, count2 = 0, tmp;
    float sum = 0;
    for (int i = 0; i < n; i++) {
    scanf("%d", &tmp);
    if (tmp < 0) {
    count1++; //统计负数个数
    }else if (tmp > 0) {
    sum += tmp; //正数求和
    count2++; //统计大于0的正数个数,这样是因为题目说明0不算在内
    }
    }
    printf("%d %.1lf\n", count1, sum / count2);
    }
    return 0;
}

数字总和一定要使用浮点数进行,否则得不到浮点数结果。整数与整数相除得不到浮点数!

小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:

1. 密码只能由大写字母,小写字母,数字构成;

2. 密码不能以数字开头;

3. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;

4. 密码长度至少为8

现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。

输入描述:输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。

输出描述:输入n行,如果密码合法,输出YES,不合法输出NO

示例: 输入:1

CdKfIfsiBgohWsydFYlMVRrGUpMALbmygeXdNpTmWkfyiZIKPtiflcgppuR

输出:YES

OJ链接【牛客网题号: OR141 密码检查】


这道题并不难,但是要求的条件非差多,当我们使用if else语句时,直接将密码遍历一遍进行层层嵌套也可以,但是可读性非常差。所以我们可以直接遍历一遍统计出大小写以及数字的字符个数,通过这些个数进行判断更加方便。

#include <stdio.h>

int main() {
    int n;
while(scanf("%d", &n)!=EOF) {
    for (int i = 0; i < n; i++) {
        char password[101] = {0};
        int upper = 0, lower = 0, digit = 0, other = 0;
        scanf("%s", password);//捕捉输入的密码
        if (strlen(password) < 8) {//密码长度小于8
            printf("NO\n");
            continue;
        }
        if (password[0] >= '0' && password[0] <= '9') {//密码以数字开头
        printf("NO\n");
        continue;
        }
        char *ptr = password;
        while(*ptr != '\0') { //统计各种字符个数
            if (*ptr >= 'a' && *ptr <= 'z') lower++;
            else if (*ptr >= 'A' && *ptr <= 'Z') upper++;
            else if (*ptr >= '0' && *ptr <= '9') digit++;
            else other++;
            ptr++;
        }
        if (other > 0) { // 有其他字符(注意:密码只能由数字和字母组成)
            printf("NO\n");
            continue;
        }
//大写,小写,数字,必须具有两种以上,而比较运算真则1,假则0
        if ((upper>0) + (lower>0) + (digit>0) < 2) { // 密码只有一种字符
            printf("NO\n");
            continue;
        }
            printf("YES\n");
        }
    }
    return 0;
}

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。请你找出数组中的最大元素并检查它是否 至 少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。

OJ链接【 leetcode 题号:747. 至少是其他数字两倍的最大数】 

示例: 输入:nums = [3,6,1,0] 输出:1

解释:6 是最大的整数,对于数组中的其他整数,6 大于数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。

输入:nums = [1,2,3,4] 输出:-1

解释:4 没有超过 3 的两倍大,所以返回 -1 。

输入:nums = [1] 输出:0

解释:因为不存在其他数字,所以认为现有数字 1 至少是其他数字的两倍。


方法一:暴力破解,双重循环遍历数组,对每个元素判断是否是其他元素的两倍。或者先遍历一遍找出最大值,然后遍历一 遍判断是否是其他数字二倍。

但是这个方法时间复杂度太高,那哟没有什么更简洁的代码吗?

一次遍历找出最大的数字和次大的数字,判断最大的数字是否是次大数字2倍即可。

int dominantIndex(int* nums, int numsSize){
    int max = 0;
    int a = 0;
    int lmax = 0;
    for(int i = 0 ; i < numsSize; i++)
    {
        if(nums[i]>max)
        {
            max = nums[i];
            a = i;
        }
        
    }
    for(int i = 0 ; i < numsSize; i++)
    {
        if(i != a)
            if(nums[i]>lmax)
                lmax = nums[i];
    }
    if(max >= 2 * lmax)
        return a;
    else
        return -1;
}

时间复杂度为O(n).

给定两个数组,编写一个函数来计算它们的交集。

OJ链接【 leetcode 题号:349. 两个数组的交集】 

示例: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4]

1 <= nums1.length, nums2.length <= 1000

0 <= nums1[i], nums2[i] <= 1000


 暴力破解即可,将 nums1 数组中的每一个数字,判断是否存在于 nums2 数组中,通过这种方式找出交集数据,找出之后判断这个数组是否已经在返回数组中存在,不存在则添加到返回数组中即可。

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    static int arr[1000];
    *returnSize = 0;
    int i, j, k;
    for (i = 0; i < nums1Size; i++) {
        for (j = 0; j < nums2Size; j++) {
            if (nums2[j] == nums1[i]) break;//判断nums1[i] 是否在nums2数组中
        }
        if (j == nums2Size) {// nums1中i位置的数据在nums2数组中不存在,则非交集数据
            continue;
        }
            //只有在另一个数组中存在的数据才能走下来,判断是否已经被添加到返回数组中
        for (j = 0; j < *returnSize; j++) {
            if (nums1[i] == arr[j]) break;//判断nums1[i] 是否在 arr 这个返回数组中
        }
        if (j == *returnSize) {//不在返回数组中,则添加到返回数组中
            arr[*returnSize] = nums1[i];
                *returnSize += 1;
        }
    }
    return arr;
}

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于 数组最右端同样适用。 

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

OJ链接【 leetcode 题号:724. 寻找数组的中心下标】

示例: 输入:nums = [1, 7, 3, 6, 5, 6]

输出:3 解释: 中心下标是 3 。 左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 , 右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

输入:nums = [2, 1, -1] 输出:0  解释: 中心下标是 0 。 左侧数之和 sum = 0 ,(下标 0 左侧不存在元素), 右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。


解题思路:从数组的0下标处开始向后逐下标统计,计算当前下标左边之和,和右边之和,进行判断,相等则为中心下标,如 果数组循环结束都没有找到中心下标,则返回-1,表示没有中心下标。

int pivotIndex(int* nums, int numsSize) {
    int i, j;
    for (i = 0; i < numsSize; i++)
    {
        int sum_left = 0, sum_right = 0;
        for (j = 0; j < numsSize; j++)
        {
            if (i > j)
            {
                sum_left += nums[j];
            }
            else if (i < j)
            {
                sum_right += nums[j];
            }
        }
        if (sum_left == sum_right)
        {
            return i;
        }
    }
    return -1;
}

Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到 大)排列收好。请大家给Lily帮忙,通过C语言解决。

输入描述:Lily使用的图片包括 "A" 到 "Z" 、 "a" 到 "z" 、 "0" 到 "9" 。输入字母或数字个数不超过 1024 。

输出描述:Lily的所有图片按照从小到大的顺序输出

OJ链接【牛客网题号: HJ34 图片整理】

示例: 输入:Ihave1nose2hands10fingers

           输出:0112Iaadeeefghhinnnorsssv


这道题就是考察我们如何排序,,每个 ascii 字符在内存都有一个对应的 ascii 值,通过内存中数据的存储进行排序就行。

什么排序方法都行:多种排序方法 有不同排序方法供参考,下面我们使用qsort函数进行排序做题。

#include <stdio.h>
#include<string.h>
#include<stdlib.h>

int compar(const void* p1, const void* p2)
{
	return *(char*)p1 - *(char*)p2;
}
int main() {

    char arr[1000];
    gets(arr);
    int sz = strlen(arr);
    qsort(arr, sz, sizeof(char), compar);
    printf("%s\n", arr);
    return 0;
}

使用qosrt函数非常简洁方便,不知道如何使用qsort函数,博主之前的博客中有解说:qsort函数使用及模拟

 以上是本次推荐的所以内容,感谢大家观看,请多多支持博主。你们的支持是我最大的动力!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytest运行时参数说明,pytest详解,pytest.ini详解

一、Pytest简介 1.pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有一下几个特点&#xff1a; 简单灵活&#xff0c;容易上手&#xff0c;支持参数化 2.能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium、appium等自动化测试&#xf…

zookeeper案例

目录 案例一&#xff1a;服务器动态上下线 服务端&#xff1a; &#xff08;1&#xff09;先获取zookeeper连接 &#xff08;2&#xff09;注册服务器到zookeeper集群&#xff1a; &#xff08;3&#xff09;业务逻辑&#xff08;睡眠&#xff09;&#xff1a; 服务端代码…

提高生产力 | Apifox 数据结构验证最佳实践

目录 实践场景 定义返回响应 场景数据准备 校验响应数据 总结 在设计接口的过程中&#xff0c;响应数据需要和返回响应规范一一对应。这样能够确保接口的一致性和可靠性&#xff0c;并且方便接口的使用和维护&#xff0c;即使在后续迭代过程中出现问题&#xff0c;开发人员…

zabbix监控安装部署

目录 一、环境 二、配置 1.配置yum源&#xff0c;这里用的清华的 2.过滤一下安装包&#xff0c;查看依赖包 安装依赖包 3.配置数据库 开机自启 创建数据库 创建用户 授权 导入数据到数据库 查看zabbix数据库有没有表和数据 4.修改zabbix配置文件 1.修改zabbix配置…

【Java】常见面试题:多线程

文章目录 1. 谈谈进程和线程之间的区别【高频】2. java中有哪些方式来创建线程&#xff1f;3. run和start的区别【经典面试题】4. Java线程的状态5. 【线程不安全的原因】6. 就以count为例&#xff1a;一个线程加锁、一个线程不加锁&#xff0c;此时能否保证线程的安全呢&#…

client-go实战之十二:选主(leader-election)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《client-go实战》系列的第十二篇&#xff0c;又有一个精彩的知识点在本章呈现&#xff1a;选主(leader-election)在解释什么是选主之前&…

Keepalived源码安装

文章目录 Keepalived源码安装安装准备缺少OpenSSL解决方法 Keepalived 源码安装 安装准备 tar zxf keepalived-2.2.8.tar.gz /root/ ll drwxrwxr-x. 10 1000 1000 4096 Aug 9 18:29 keepalived-2.2.8 #进入目录执行以下命令查看帮助 ./configure --help #重要编译参数 -…

QT学习笔记-oracle oci数据库驱动交叉编译并移植到ARM开发板

QT学习笔记-oracle oci数据库驱动交叉编译并移植到RK3568ARM开发板 0、背景1、搭建交叉编译环境2、交叉编译过程3、把数据库驱动部署到目标系统中 0、背景 在上一文《QT学习笔记-QT安装oracle oci驱动》中介绍了在Windows环境下使用QT访问oracle数据库时遇到驱动无法加载问题的…

kingbase:数据库启动状态

1 启停KingbaseES数据库 Linux下通过系统服务&#xff1a; root用户执行&#xff1a; service kingbase8d stop/start/restart ——注册服务的情况下 Linux下通过安装用户&#xff1a; 安装用户执行&#xff1a; sys_ctl stop/start/restart -D data路径 2 查看数据库当…

UI自动化环境的搭建(python+pycharm+selenium+chrome)

最近在做一些UI自动化的项目&#xff0c;为此从环境搭建来从0到1&#xff0c;希望能够帮助到你&#xff0c;同时也是自我的梳理。将按照如下进行开展&#xff1a; 1、python的下载、安装&#xff0c;python环境变量的配置。 2、pycharm开发工具的下载安装。 3、selenium的安装。…

【Java】一只小菜坤的编程题之旅【3】

文章目录 1丶判定是否互为字符重排2、杨辉三角3丶某公司的1个面试题&#xff08;字符串包含问题&#xff09; 1丶判定是否互为字符重排 这个题我们用一个非常简单的思想就能实现&#xff0c;我们先将字符串转换为字符数组&#xff0c;然后对字符数组进行排序&#xff0c;然后再…

Codeforces Round 893 (Div. 2)ABC

Codeforces Round 892 (Div. 2) 目录 A. United We Stand题目大意思路代码 B. Olya and Game with Arrays题目大意思路代码 C. Another Permutation Problem题目大意思路代码 A. United We Stand 题目大意 给你一个数组&#xff0c;把这个数组分成两个数组a和b&#xff0c;使…

03_013内存分配api以及页表详解

前言 之前文章中物理ram中的最小单位一直用页来表示 这次又描述的详细了点 物理ram的最小单位 有的地方叫 块,框,页帧 在虚拟空间中最小单位也叫页 需要好好区分 不过后来想想管你虚拟页还是物理ram页 都存在物理ram上 都能想成一 一对应的关系 所以大家都叫页好像也行 内存分…

【Unity3D】Shader Graph节点

1 前言 Shader Graph 16.0.3 中有 208 个 Node&#xff08;节点&#xff09;&#xff0c;本文梳理了 Shader Graph 中大部分 Node 的释义&#xff0c;官方介绍详见→Node-Library。 Shader Graph 通过图像的形式表达了顶点变换和片元着色流程&#xff0c;其背后都是一些列的数学…

保持城市天际线(力扣)贪心 JAVA

给你一座由 n x n 个街区组成的城市&#xff0c;每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天际线 是从远处观察城市时&#xff0c;所有建筑物形成的外部轮廓。…

【系统架构】分布式系统架构设计

1 分布式系统是什么 分布式系统是指由多个计算机节点组成的一个系统&#xff0c;这些节点通过网络互相连接&#xff0c;并协同工作完成某个任务。 与单个计算机相比&#xff0c;分布式系统具有更高的可扩展性、可靠性和性能等优势&#xff0c;因此广泛应用于大规模数据处理、高…

大数据-玩转数据-Flink 自定义Sink(Mysql)

一、说明 如果Flink没有提供给我们可以直接使用的连接器&#xff0c;那我们如果想将数据存储到我们自己的存储设备中&#xff0c;mysql 的安装使用请参考 mysql-玩转数据-centos7下mysql的安装 创建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

使用日志来监控应用

根据提取规则运行的位置可以分为两类做法&#xff0c;一个是在中心端&#xff0c;一个是在日志端。 中心端就是把要处理的所有机器的日志都统一传到中心&#xff0c;比如通过 Kafka 传输&#xff0c;最终落到 Elasticsearch&#xff0c;指标提取规则可以作为流计算任务插到 Ka…

3.解构赋值

解构赋值是一种快速为变量赋值的简洁语法&#xff0c;本质上仍然是为变量赋值。 3.1数组解构 数组解构是 将数组的单元值快速批量赋值给一系列变量 的简洁语法 1.基本语法: &#xff08;1&#xff09;赋值运算符左侧的[ ]用于批量声明变量&#xff0c;右侧数组的单元值将被赋…

免费开源的多种人工智能项目,比如:训练一个模型,让人工智能玩王者荣耀

免费开源的多种人工智能项目&#xff0c;比如&#xff1a;训练一个模型&#xff0c;让人工智能玩王者荣耀。 全文大纲 PULSE - 该开源项目可以通过给图片增加像素点来实现去马赛克或高清化。 Depix - 给打了马赛克的文字去码。 TecoGAN - 给视频去马赛克或者进行超分辨率。 Sk…