【C语言】经典编程题

news2024/11/19 20:22:29

文章目录

  • 1. Fibonacci数列 ⭐️
  • 2. 替换空格 🌟
  • 3. 找单身狗 💫
  • 4. 模拟实现 atoi ✨

1. Fibonacci数列 ⭐️

做题链接:Fibonacci数列

Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

  • 输入描述:输入为一个正整数N(1 ≤ N ≤ 1,000,000)
  • 输出描述:输出一个最小的步数变为Fibonacci数"

示例:

  • 输入:15
  • 输出:2

思路:当 n 落在第一个斐波那契数的左边的时候似乎没有什么意义,它只有变成第一个斐波那契数的可能,没有最小步数。所以只有当 n 落在第一个斐波那契数和第二个斐波那契数的中间时,才求最少需要多少步可以变成斐波那契数。

  • 如果 n 等于第二个斐波那契数,步数就等于0。
  • 如果 n 小于第二个斐波那契数,分别求第一个斐波那契数和第二个斐波那契数分别减 n 的绝对值差,并比较大小。这里引用求绝对值的库函数abs,头文件 #include <math.h> 。当 abs(f1-n)<abs(f2 - n);则打印输出abs(f1-n)的值;反之则输出abs(f2-n)的值。
  • 如果 n 不等于也不小于第二个斐波那契数,n 大于第二个斐波那契数的时候,我们这边用赋值进行下一组数的计算。

代码如下:

#include <stdio.h>
#include <math.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int f1 = 0;
	int f2 = 1;
	int f3 = f1 + f2;
	while (1)
	{
		if (n == f2)
		{
			printf("0\n");
			break;
		}
		if (n < f2)
		{
			if (abs(f1 - n) < abs(f2 - n))
			{
				printf("%d\n", abs(f1 - n));
			}
			else
			{
				printf("%d\n", abs(f2 - n));
			}
			break;
		}
		//n>f2
		f1 = f2;
		f2 = f3;
		f3 = f1 + f2;
	}
	return 0;
}

在这里插入图片描述

2. 替换空格 🌟

做题链接:替换空格

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

这里有的人就会想将空格替换成%20有什么意义呢?是不是太闲了呢?
在这里插入图片描述
当我们在百度搜索栏中输入We Are Happy就会看到地址栏里出现We%20Are%20Happy,在搜索链接里会将空格替换成%20,这是为什么呢?因为空格的ASCII码值是20。

在这里插入图片描述
当我们点击链接会发现这道题在牛客网是这样的,这种是接口型的OJ题目。
OJ题目分为两种:

  1. IO型:自己完成输入输出,包括 main 函数
  2. 接口型:只需要完成接口就可以了
    接口型的OJ题目要假定 main 函数已经有了,并且调用了replaceSpace(),传递了何时的参数。

做题思路:

  • char *str,int length 这句代码的意思是把 str 指向的字符串里的空格替换成20,str指向的字符串长度是length。
  • 一个空格要被替换成%20,就是一个字符要变成3个字符,所以字符本质上要往后挪,遇到一个空格就要增长2个字符,假设有 n 个空格,字符串的长度就等于nx2+原字符串的长度。
  • 给两个标记,end1 标记替换之前的字符串的最后一个元素,end2 标记替换之后的字符串的最后一个元素,在 end1 没有遇到空格之前,把 end1 标记的元素挪移到 end2 标记的位置之后,end1 和 end2 都向前挪动,当 end1 遇到空格后,end1 向前挪动一步,把 end2 标记的位置依次写入02%(从后往前赋值),在写的过程中,每写一个字符,end2 向前移动一步,循环这个过程,直到把所有空格替换完成,当 end1 和 end2 指向同一个元素时替换完成。
    在这里插入图片描述
#include <stdio.h>
#include <string.h>
void replaceSpace(char* str, int length) {
    int space_count = 0;//统计空格的个数
    char* cur = str;
    //*cur!=\0,开始遍历
    while (*cur)
    {
        if (*cur == ' ')
            space_count++;
        cur++;
    }
    //计算end1,end2
    char* end1 = str + length;
    char* end2 = str + length + 2 * space_count;
    while (end1 != end2)
    {
        if (*end1 != ' ')
        {
            *end2-- = *end1--;//后置--,先赋值再减
        }
        else
        {
            *end2-- = '0';//从后往前赋值
            *end2-- = '2';
            *end2-- = '%';
            end1--;
        }
    }
}
int main()
{
    char arr[40] = "We Are Happy";
    int len = strlen(arr);
    replaceSpace(arr, len);
    printf("%s\n", arr);
    return 0;
}

在这里插入图片描述

3. 找单身狗 💫

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。

示例:

  • 输入数组的为:1 2 3 4 5 1 2 3 4 6
  • 输出:5 6

思路:
异或操作符^:相同为0;相异为1;异或操作符是支持交换律的。

a^a = 0;
0^a = 0;
1^3^1 = 3;
1^1^3 = 3;

找一个单生狗 1 2 3 4 5 1 2 3 4,用异或操作符就能找出单生狗是5了。
找两个单生狗1 2 3 4 5 1 2 3 4 6,我们这里就需要给他分组,把5和6分到两个组里,每一个组里只有一个单生狗,其余的都是成对的。例如:A组:1 2 1 2 5;B组:3 4 3 4 6;或者A组 1 3 1 3 5;B组 2 4 2 4 6。怎样才能实现以上的分组你呢?5的二进制位101,6的二进制位110;5^6 = 011,异或的结果为011,证明他们的最低为和第二位都不相同。5的最低位是1,6的最低位是0;我们就将最低位为1的分到A组,最低位为0的分到B组。或者用第二位分组也可以。
分组思想:

  1. 计算5和6二进制中的哪一位为1(第n位)
  2. 以第n位为标准,第n位为1的放一组,第n位为0的放一组。
#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
	//所有数字异或
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = 0;
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	//ret 就是5^6的结果,二进制中一定有1
	//计算ret的第几位是1
	int pos = 0;
	for (i = 0; i < 32; i++)
	{
		if ((ret >> i) & 1 == 1)
		{
			pos = i;
			break;
		}
	}
	//ret的pos位是1
	//把arr数组中的每个元素的第pos位为1的数字异或在一起
	int num1 = 0;
	int num2 = 0;
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			num1 ^= arr[i];
		}
		else
		{
			num2 ^= arr[i];
		}
	}
	printf("%d %d", num1, num2);
	return 0;
}

在这里插入图片描述

4. 模拟实现 atoi ✨

atoi 把字符串转换成对应的数字

atoi的使用:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int ret = atoi("123");
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述
模拟实现atoi

//模拟实现atoi会出现的情况
//my_atoi(NULL)//异常
//my_atoi("")//异常
//my_atoi("    +123")//正常
//my_atoi("-123")//正常
//my_atoi("123abc")//异常
//my_atoi("1111111111111111111111111")//异常
//my_atoi("-1111111111111111111111111")//异常

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <ctype.h>
//枚举定义状态值
enum Status
{
	VALID,//合法
	INVALID //非法
};
enum Status status = INVALID;//定义一个全局的状态值为非法
//根据返回值判断是非法的还是合法的
int my_atoi(const char* str)
{
	if (str == NULL)
	{
		return 0;
	}
	if (*str == '\0')
	{
		return 0;
	}
	//空白字符
	while (isspace(*str))
	{
		str++;
	}
	int flag = 1;
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	//处理数字字符
	//123
	long long ret = 0;
	while (isdigit(*str))
	{
		ret = ret * 10 + flag * (*str - '0');
		if (ret<INT_MIN || ret>INT_MAX)//值越界了
		{
			return 0;
		}
		str++;
	}
	if (*str == '\0')
	{
		status = VALID; //定义一个局部的状态值为合法
		return (int)ret;
	}
	else
	{
		return (int)ret;
	}
}
int main()
{
	int ret = my_atoi("   -123");
	if (status == VALID)
		printf("合法转换:%d\n", ret);
	else
		printf("非法转换:%d\n", ret);
	return 0;
}

在这里插入图片描述

本章到这里就结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!
Fighting!!!✊

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

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

相关文章

[数据结构初阶]算法的时空复杂度

目录 算法效率 如何衡量一个算法的好坏 算法的复杂度 时间复杂度 时间复杂度的概念 大O的渐进表示法 常见时间复杂度计算举例 例一&#xff1a; 例二&#xff1a; 例三&#xff1a; 例四&#xff1a…

C规范编辑笔记(三)

继上篇我们的C规范编辑笔记(二)后&#xff0c;我们今天开始分享第三篇笔记&#xff0c;话不多说&#xff0c;我们开始~ 1、一个 tab 键盘等于四个空格键。我们在编程的时候最好使用空格键而不是使用 tab 键&#xff0c;当两个编译器的 tab 键设置的大小不一样的时候&#xff0…

无人机基础知识:多旋翼无人机自动控制原理与算法

无人机基础知识&#xff1a;多旋翼无人机自动控制原理与算法前言无人机自动控制器PID控制算法前言 无人机&#xff08;Unmanned Aerial Vehicle&#xff09;&#xff0c;指的是一种由动力驱动的、无线遥控或自主飞行、机上无人驾驶并可重复使用的飞行器&#xff0c;飞机通过机…

Linux:进程描述、进程创建(fork)、进程状态(僵尸进程、孤儿进程)

目录操作系统进程的基本概念进程创建&#xff08;fork)进程状态僵尸进程孤儿进程操作系统 操作系统是一个管理计算机软硬件资源的软件&#xff0c;它包括内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09;和其他程序&#x…

神经网络输出表达式,神经网络数据格式

1、BP神经网络输入输出格式问题 在你的代码基础上说了。 clc;clear; close all; pload(originaldata.txt);%你问题最后说的数据文件名跟这个不同。 p1p; t[1];% 这个输出&#xff08;Targets&#xff09;应该和输入数据对应&#xff0c;输入数据有10个&#xff0c;输出应该也是…

如何从0到1搭建一个个人网站

前言 如何从0到1搭建一个可以外网访问的项目&#xff1f; 我就用自己的服务器给大家举例&#xff0c;怎么从0到1搭建一个学生和新手可以用来面试的项目&#xff0c;老手也可以回忆一下自己逝去的青春。 服务器在激活的时候会让你选系统&#xff0c;这个时候敖丙我个人建议&a…

软考 | 计算机系统

CPU 计算机系统硬件组成 计算机系统是由软硬件共同组成&#xff0c;协同运行程序。计算机的基本硬件由 运算器、控制器、存储器、输入设备、输出设备 5 大部件组成。其中&#xff0c;运算器和控制器等部件集成到一起的部分称为中央处理器&#xff08;CPU&#xff09;。CPU 是…

离线数仓 (八) --------- 数仓分层

目录一、为什么要分层二、数据集市和数据仓库区别三、数仓命名规范1. 表命名2. 脚本命名3. 表字段类型一、为什么要分层 分层说明&#xff1a; ODS 层&#xff1a;原始数据层&#xff0c;存放原始数据&#xff0c;直接加载原始日志、数据&#xff0c;数据保持原貌不做处理。 …

【C++】命名空间输入输出缺省参数函数重载

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;什么是C&…

链路状态路由协议 OSPF (一)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.OSPF的基本概念 1.什么是OSPF 2.OSPF路由协议概述 (1)内部…

网络安全知识之什么是网络安全?

网络安全的概念&#xff0c;有很多不同的定义。在一些场合中&#xff0c;我们最多的考虑的还是网络的技术安全&#xff0c;但是技术延伸出来的安全又会涉及到社会安全、文化安全、国家安全等等。 网络安全的概念&#xff0c;有很多不同的定义。在一些场合中&#xff0c;我们最多…

升级全新网络方案,给你低成本、高性能的裸金属体验

摘要&#xff1a;对政企、金融客户来说&#xff0c;裸金属服务器相比于云服务器&#xff0c;更能满足他们对性能和稳定性的要求。但裸金属服务器的网络实现&#xff0c;却存在成本高、灵活性差、成熟度不足等问题。为解决这些问题&#xff0c;华为云Stack有一套增强版的网络方案…

Unity Rigidbody实现爬坡功能

文章目录&#x1f388; 简介&#x1f388; 实现原理&#x1f388; 实现代码&#x1f388; 简介 人物移动功能的实现或许用到Character Controller组件或许用到Rigidbody刚体组件&#xff0c;前者可以直接实现在某些高地不平的地面上移动&#xff0c;而后者想要在具有一定角度的…

分布式事务Seata源码解析十:AT模式回滚日志undo log详细构建过程

文章目录一、前言二、准备undo log0、undo log 样例1&#xff09;undo log表结构2&#xff09;rollback_info&#xff08;回滚日志数据&#xff09;1、before image的构建1&#xff09;业务表元数据信息TableMeta1> Caffeine缓存数据获取2> Caffeine缓存自动刷新2&#x…

[Linux打怪升级之路]-vim编辑器(看就能马上操作噢)

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、vim的…

语音合成 GAN Vocoders 总览

Loss 函数简称与全称的对应关系 Short NameFull Nameadvadversial lossFMFeature MatchingMSDMulti-Scale Discriminatormr-STFTMulti-resolution STFT lossfmr-STFTfull band Multi-resolution STFT losssmr-STFTsub band Multi-resolution STFT lossMelMel-Spectrogram Loss…

Mybatis----多表查询

目录 返回类型 resultType resultMap 1、字段映射 2、多表查询 动态SQL if标签 where标签 set标签 choose(when,otherwise) 语句 trim标签 for-each标签 SQL片段 返回类型 resultType Mybatis在查询时&#xff0c;一定要指定返回类型&#xff1b;而其他操作&#xff0…

BH1750 传感器实战教学 —— 硬件设计篇

前言 前面刚写了一篇 《BH1750 光照传感器文档详解 及 驱动设计》&#xff0c;今天来写一篇简单的传感器实战教学。 文章如下&#xff1a;BH1750 光照传感器文档详解 及 驱动设计 那有些朋友就疑惑了&#xff0c;在上一篇文章其实我们基本都测试成功了&#xff0c;驱动也写了…

现代操作系统原理与实现

突然更新&#xff0c;为了水一个1024徽章拿随书笔记来发发&#xff08;嘿嘿 原文链接&#xff1a;https://github.com/yanyanran/YBlog/blob/main/%E7%8E%B0%E4%BB%A3%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E7%8E%B0.md 一、操作系统结构…

【网络安全篇】JavaSript基础内容大全

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;学习JavaSript基础 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;网络安全 JavaSript基础大全&#x1f340;java和JavaSri…