C语言弯道超车必做好题锦集(编程题)

news2024/11/20 7:01:33

目录

前言:

1.计算日期到天数转换

2.尼科彻斯定理 

3.密码检查

4.图片整理

5.寻找数组的中心下标

6.字符个数统计

7.多数元素


前言:

编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,此为第一篇编程题篇,每篇大约5题左右。该系列会不定期更新,敬请期待!


1.计算日期到天数转换

描述

根据输入的日期,计算是这一年的第几天。

保证年份为4位数且日期合法。

进阶:时间复杂度: O(n) ,空间复杂度:O(1) 

输入描述:

输入一行,每行空格分割,分别是年,月,日

输出描述:

输出是这一年的第几天

#include<stdio.h>
int main()
{
    int arrmonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int year, month, day;
    scanf("%d %d %d", &year, &month, &day);

    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        arrmonth[1]++;
    int i = 0;
    for (i = 0; i < month - 1; i++) 
    {
        day = day + arrmonth[i];
    }
    printf("%d", day);
    return 0;
}

思路:

1.闰年的判断方法

(1)能被4整除,但不能被100整除;

(2)能被400整除。

2. 每个月份的天数

一三五七八十腊 是31天, 二月,闰年 29天,平年28天, 其他月份是30天

3. 计算月份之前的n-1月的天数,加上本月的天数


2.尼科彻斯定理 

描述

验证尼科彻斯定理,即:任何一个整数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

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

解析:

数值大小是几,就会有几个奇数相加。

1^3=1                                

2^3=3+5

3^3=7+9+11

4^3=13+15+17+19

我们不难发现这是一个从1开始的奇数等差数列{1,3,5,7,9……}。

故我们只要知道了数值是几所对应的数,就可以知道相加的任意数,并且符合规律。

如:

1^3=1                                                          1- >1                          1+(1-1)^2

2^3=3+5                                                      2- >3                          2+(2-1)^2

3^3=7+9+11                                                3- >7                         3+(3-1)^2

4^3=13+15+17+19                                     4- >13                        4+(4-1)^2

……

……                                                                                               n+(n-1)^2

sprintf的用法如果不熟,可以看本博主的这篇文章。(在文件的顺序读写的第7个)

C语言文件操作_WHabcwu的博客-CSDN博客需求:我们想把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据 库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。1.2。https://blog.csdn.net/WHabc2002/article/details/131755342


3.密码检查

描述

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

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

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

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

4. 密码长度至少为8

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

输入描述:

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

输出描述:

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

分析:

这道题只需要将字符串从头到尾的每种字符(大写字符,小写字符,数字,其他字符)分别统计出来后。然后逐个 判断是否符合条件即可。而条件的判断包含有:
长度不小于 8
不能以数字开头
只能包含字母和数字
大小写和字符必须具备两种以上

直接看代码:

#include<stdio.h>
#include<ctype.h>
#include<assert.h>
#include<string.h>
int f(char* arr)
{	    
	    assert(arr);
	    int i = 0;
		int sz = strlen(arr);
		if (sz < 8)
		{
			return 0;
		}
		if (arr[0] >= '0' && arr[0] <= '9')
		{
			return 0;
		}
		int* count = (int*)calloc(3, sizeof(int));
		for (i = 0; i < sz; i++)
		{
			
			if (arr[i] >= '0' && arr[i] <= '9')
			{
				count[0] = 1;
			}
			else if (islower(arr[i]))
			{
				count[1] = 1;
			}
			else if (isupper(arr[i]))
			{
				count[2] = 1;
			}
			else
			{
				free(count);
				return 0;
			}
		}
		if ((count[0] + count[1] + count[2] )>= 2)
		{
			free(count);
			return 1;
		}
		else
		{
			free(count);
			return 0;
		}

}
int main()
{
	char arr[101] = { 0 };
	int n=0;
	scanf("%d", &n);
	while (n)
	{
		scanf("%s", arr);
		n--;
		int x=f(arr);
		if (x == 1)
		{
			printf("YES\n");
		}
		else
		{
			printf("NO");
		}
	}
	
	return 0;
}

4.图片整理

描述

 输入描述:

 输出描述:

 

 代码:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[1000];
	gets(arr);
	int i = 0, j = 0;
	for (i = 0; i < strlen(arr) - 1; i++)
	{
		for (j = 0; j < strlen(arr) - 1 - i;j++)
		{
			if (arr[j] > arr[j + 1])
			{
				char t = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = t;
			}
		}
	}
	puts(arr);
	return 0;
}
【答案解析】:
这道题考察的其实就是字符排序,每个 ascii 字符在内存都有一个对应的 ascii 值,通过内存中数据的存储进行排序 就行。
冒泡排序:相邻数据之间进行比较交换,将较大或较小的数据向后推到数组末尾,然后开始下一轮次大数据的冒泡 过程。

5.寻找数组的中心下标

寻找数组的中心下标https://leetcode.cn/problems/find-pivot-index/

#include<stdio.h>
int pivotIndex(int* nums, int numsSize) {
	int total = 0;
	int i = 0;
	int sum = 0;
	for (i = 0; i < numsSize; i++)
	{
		total += nums[i];
	}
	for (i = 0; i < numsSize; i++)
	{
		if (2 * sum + nums[i] == total)
		{
			return i;
		}
		sum += nums[i];
	}
	return -1;
}

解析:

记数组arr的全部元素之和为 total,当遍历到第 i 个元素时,设其左侧元素之和为sum,

则其右侧元素之和为 total−sum-arr[i],左右侧元素相等即有arr[i]+sum*2=total.


6.字符个数统计

 思路:创建128大小的数组,标记出现过的字符,然后统计标记个数

#include<stdio.h>
#include<string.h>
int main()
{
	int arr[127] = { 0 };
	char str[500];
	gets(str);
	int i=0;
	int sz = strlen(str);
	int count = 0;
	for (i = 0; i < sz; i++)
	{
		if (arr[str[i]] == 0)
		{
			count++;
			arr[str[i]] = 1;
		}
	}
	
	printf("%d", count);
	return 0;
}

7.多数元素

多数元素https://leetcode.cn/problems/majority-element/

 方法1:数组排序法

思路:

如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 n/2
的元素(下标从 0 开始)一定是众数。

int majorityElement(int* nums, int numsSize) {
	int i = 0, j = 0;
	for (i = 0; i < numsSize-1; i++)
	{
		for (j = 0; j < numsSize - 1; j++)
		{
			if (nums[j] < nums[j + 1])
			{
				int t = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = t;
			}
		}
	}
	return nums[numsSize / 2];
}

因为冒泡排序的时间复杂度为O(n^2)

方法2:摩尔投票法

int majorityElement(int* nums, int numsSize){
int count = 1;
int tmp = nums[0];
for (int i = 1; i < numsSize; i++) {
if (tmp == nums[i]){//与保存的字符相同则计数+1
count++;
} else {//与保存的字符不同则计数-1
count--;
//计数为0表示有可能保存的字符不是最多的字符,换下一个
if (count == 0) tmp = nums[i + 1];
}
}
return tmp;
}
【答案解析】:
一个数组中有一个数字出现次数大于 n/2 ,从第 0 个字符开始,假设它就是最多的那个数字,遇到相同的数字则 计数 +1 , 遇到不同的则计数 -1 ,其实就是互相消耗,等到计数为 0 的时候,表示本次互拼完毕,从下一个字符重 新开始互拼,但是归根结底出现次数大于 n/2 的这个数字数量更多,因此也是最后保留的字符。
示例:
"23335" 首先从字符 2 开始计数 1 ,遇到 3 ,不同则 -1 ,互拼消耗 重新从剩下的 "335" 开始的过程,这时 候保存的字符为 3 ,遇到 3 则计数 +1 , 遇到 5 则计数 -1 ,在计数不为 0 时,走到末尾保存的字符就是个数超过 n/2 的字符


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

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

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

相关文章

压力检测器的基本信息是什么

压力检测器利用了传感器技术、电路处理技术、无线传输技术&#xff0c;能够精准测量气体或者液体等介质的压力&#xff0c;并将测得的数据上传至监控平台。 压力检测器能够适用于供水厂、污水处理厂、消防水系统、输油管道、输气管道等相关场景&#xff0c;拥有自动补偿功能、…

你知道开发程序的流程化、模块化、规范化是怎样的?不同厂商一样吗?

Postive&#xff1a; 我在天津的公司 都是netframwork的 .......... 后来 去北京 就找core 的技术 确实感觉不是一个层次的 .......... Postive&#xff1a; 以前 在天津 就是堆业务 部署iis 点点就完事了 用个redis 就牛逼的不行了 干上core的项目才发现 授权是单独…

[C++] STL_vector使用与常用接口的模拟实现

文章目录 1、vector的介绍2、vector的使用2.1 vector的定义2.2 vector迭代器的使用2.3 vector的空间增长问题 3、vector的增删查改3.1 push_back&#xff08;重点&#xff09;3.2 pop_back&#xff08;重点&#xff09;3.3 operator[]&#xff08;重点&#xff09;3.4 insert3.…

腾讯云下一代CDN -- EdgeOne加速MinIO对象存储

省流 使用MinIO作为EdgeOne的源站。 背景介绍 项目中需要一个兼容S3协议的对象存储服务&#xff0c;腾讯云的COS虽然也兼容S3协议&#xff0c;但是也只是支持简单的上传下载&#xff0c;对于上传的时候同时打标签这种需求&#xff0c;就不兼容S3了。所以决定自建一个对象存储…

基于Java+SpringBoot+vue前后端分离在线问卷调查系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

VR云游同美景邂逅,抓住暑假的小尾巴~

暑期余额不足的宝子们&#xff0c;是不是还没出门玩耍玩个够呢&#xff1f;不如趁这个时候&#xff0c;用VR云游抓住暑假的小尾巴&#xff0c;收获一波开学前的“收心之旅”吧&#xff01; VR云游相较于传统旅游来说&#xff0c;是通过个性化云服务&#xff0c;为智能景区建立综…

【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

线性代数的学习和整理8:行列式相关

目录 1 从2元一次方程组求解说起 1.1 直接用方程组消元法求解 1.2 有没有其他方法呢&#xff1f;有&#xff1a;比如2阶行列式方法 1.3 3阶行列式 2 行列式的定义 2.1 矩阵里的方阵 2.2 行列式定义&#xff1a;返回值为标量的一个函数 2.3 行列式的计算公式 2.4 克拉…

189. 轮转数组

189. 轮转数组 class Solution { public:void rotate(vector<int>& nums, int k) {int n nums.size();k k % n;reverse(nums.begin(),nums.end());reverse(nums.begin(),nums.begin()k);reverse(nums.begin()k,nums.end());} };

2023年高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

最新活动报名表单系统源码 支持表单自定义+在线支付报名

分享一款最新活动报名表单系统源码&#xff0c;支持任意行业各种活动在线支付报名&#xff0c;配合万能自定义表单&#xff0c;适用于各种活动报名、课程招生、会议报名统计等等。 功能特点一览&#xff1a; 表单自定义&#xff1a;该报名系统允许组织者根据活动的需求自定义报…

Mybatis与Spring整合以及Aop整合pagehelper插件

一. Mybatis与Spring的集成 将MyBatis与Spring进行整合&#xff0c;主要解决的问题就是将SqlSessionFactory对象交由Spring容器来管理&#xff0c;所以&#xff0c;该整合&#xff0c;只需要将SqlSessionFactory的对象生成器SqlSessionFactoryBean注册在Spring容器中&#xff…

从头开始:将新项目上传至Git仓库的简易指南

无论您是一个经验丰富的开发者还是一个刚刚起步的新手&#xff0c;使用Git来管理您的项目是一个明智的选择。Git是一个强大的版本控制系统&#xff0c;它可以帮助您跟踪项目的变化、合并代码以及与团队成员协作。在本文中&#xff0c;我们将为您提供一步步的指南&#xff0c;教…

opengl shader nv格式转换

可以参考&#xff1a; OpenGL: 如何利用 Shader 实现 RGBA 到 NV21 图像格式转换&#xff1f;&#xff08;全网首次开源&#xff09; - 知乎 nv12 #extension GL_OES_EGL_image_external : require precision mediump float; varying vec2 vTextureCoord; uniform sampler2D…

Matplotlib | 高阶绘图案例【1】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 绘制图布&#xff0c;设置坐标范围&#x1f3f3;️‍&#x1f308; 2. 绘制圆角矩形&#x1f3f3;️‍&#x1f308; 3. 添加水滴&#x1f3f3;️‍&#x1f308; 4. 添加时间线&#x1f3f3;️‍&#x1f308; 5. 添加文本、配色&…

ssm+vue海鲜自助餐厅系统源码和论文

ssmvue海鲜自助餐厅系统源码和论文068 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&…

如何写好新闻稿

写好新闻稿是一门技巧和艺术的结合。一个有效的新闻稿应该能够快速吸引读者的注意力&#xff0c;并为他们提供有价值的信息。以下是如何写好新闻稿的步骤和建议&#xff1a; 1.吸引眼球的标题 简短明了&#xff1a;标题应该简洁&#xff0c;一眼就能告诉读者新闻的核心内容。使…

Python打包exe和生成安装程序

1.打包exe python打包成exe文件的一般步骤如下&#xff1a; 安装pyinstaller模块&#xff0c;可以使用pip install pyinstaller命令来安装或更新pyinstaller模块。在cmd中切换到要打包的python文件所在的目录&#xff0c;输入pyinstaller -F 文件名.py命令来生成单个exe文件。…

SpringCloud组件总结

原链接如下&#xff1a; https://www.processon.com/view/link/64e85fe76b2cbb581a3835bc 访问密码&#xff1a;afGw 如图&#xff1a;

AD(第五部分---PCB设计规则设置及PCB手工布线)

第五部分---PCB设计规则设置及PCB手工布线 29.Class,设计参数&#xff0c;规则的创建 Class部分操作&#xff1a; 分别设置电源和信号线(主要目的是因为电流线宽(大电流需要加粗)&#xff0c;信号线宽的要求是不一样的) 改变电源线的颜色设置&#xff1a; 如下图所示处(此处…