【C语言】初阶数据结构相关习题(一)

在这里插入图片描述
🎆个人主页:夜晚中的人海

在这里插入图片描述

今日语录:人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。——奥斯特洛夫斯基

文章目录

  • ⭐一、判定是否互为字符重排
  • 🎉二、 回文排列
  • 🚀三、字符串压缩
  • 🎡四、递归乘法
  • 🏠五、取近似值
  • 🏝️六、数列
  • 🚆七、搜索插入位置
  • 🚘八、搜索旋转排序数组
  • 🏖️九、二进制链表转整数

⭐一、判定是否互为字符重排

题目描述:判定是否互为字符重排

在这里插入图片描述

解题思路:
1.首先判断两个字符串长度是否相等,若不相等,那么他们不可能彼此排列,直接返回false。

2.若字符串长度相等,我们就可以使用qsort函数对两个字符串进行排序来判断它们是否排列。

qsort 是标准库中的快速排序函数,它需要以下参数:
• 要排序的数组(s1 和 s2)。
• 数组的长度(len1 和 len2)。
• 每个元素的大小(sizeof(char))。
• 比较函数(cmp)。

3.排序完成后,如果两个字符串是彼此的排列,那么它们排序后的结果应该完全相同,因此我们就可以使用strncmp函数来比较排序后的字符串。

代码实现:

int cmp(const void* a,const void* b)
{return *(char*)a - *(char*)b;
}bool CheckPermutation(char* s1, char* s2) {int len1 = strlen(s1);int len2 = strlen(s2);if(len1 != len2){return false;}qsort(s1,len1,sizeof(char),cmp);qsort(s2,len2,sizeof(char),cmp);if(strncmp(s1,s2,len1) == 0){return true;}return false;
}

🎉二、 回文排列

题目描述:回文排列

在这里插入图片描述

解题思路:
1.我们首先要理解回文字符串的特性,一个字符串可以通过重新排列形成回文字符串的条件是:如果字符串长度为偶数,那么每个字符必须出现偶数次;如果字符串长度为奇数,那么最多只能有一个字符出现奇数次其余字符必须出现偶数次

2.我们使用一个大小为 128 的数组 a 来统计每个字符的出现次数(假设字符集为 ASCII,其范围为 0-127)。

3.遍历字符串 s,将每个字符的 ASCII 码值对应的数组位置加一。

4.遍历数组 a,统计出现次数为奇数的字符个数,如果某个字符的出现次数是奇数,则count 加一。

5.如果 count 大于等于 2,说明有多个字符的出现次数为奇数,这种情况下无法形成回文字符串,直接返回 false。

6.遍历完数组后,如果count的值小于2,说明最多只有一个字符的出现次数为奇数,这种情况下可以构成回文字符串,则返回 true。

代码实现:

bool canPermutePalindrome(char* s) {int len = strlen(s);int a[128] = {0};int count = 0;for(int i = 0;i < len;i++){//将字符所对应的ASCII码值位置++a[s[i]]++;}for(int i = 0;i < 128 ;i++){if(a[i] % 2 == 1){count++;}if(count >= 2){return false;}}return true;
}

🚀三、字符串压缩

题目描述:字符串压缩

在这里插入图片描述

解题思路:
1.首先判断特殊情况,如果字符串的长度小于等于2,则压缩后的字符串长度并不会小于原始字符串,因此直接返回源字符串。

2.分配一个足够大的内存空间用于存储压缩后的字符串。初始化计数器count 为 1,用于记录当前字符的连续出现次数;初始化指针 p 为 0,用于记录压缩后字符串的当前位置。

3.使用一个循环从第 1 个字符开始遍历字符串,直到字符串末尾。如果当前字符与前一个字符相同,则计数器 count 加一;如果当前字符与前一个字符不同,则将前一个字符及其出现次数写入压缩后的字符串。(将字符写入 ret[p],并将指针 p 向后移动一位;使用sprintf函数将计数器 count 转换为字符串并写入 ret[p],同时更新指针 p 的位置。重置计数器 count 为 1,开始统计下一个字符的连续出现次数。)

4.遍历完成后,比较压缩后的字符串长度与原始字符串长度,如果压缩后的字符串长度大于原始字符串长度,则返回原始字符串,否则返回压缩后的字符串。

代码实现:

char* compressString(char* S) {int len = strlen(S);char* ret = (char*)malloc(sizeof(char)*len*2);int count = 1;int p = 0;int n = 0;if(len <= 2){return S;}for(int i = 1;i < len + 1;i++){if(S[i] == S[i - 1]){count++;}else{ret[p] = S[i - 1];p++;n = sprintf(&ret[p],"%d",count);p = p + n;count = 1;}}if(strlen(ret) > len){return S;}else{return ret;}
}

🎡四、递归乘法

题目描述:递归乘法

在这里插入图片描述

解题思路:
1.我们可以理解乘法其实就是重复的加法。如:A×B 可以表示为将 A 加上自身 B 次。

2.如果B>1时,则该问题就可以被分解为A×B=A+(A×(B−1));当 B=1 时,乘积直接等于 A,因为任何数乘以 1 都等于它本身。

3.每次递归调用都会返回一个部分结果,最终将所有部分结果累加起来,得到最终的乘积。

代码实现:

int multiply(int A, int B) {int ret = 0;if(B > 1){ret += multiply(A,B-1) + A;}else{ret = A;}return ret;
}

🏠五、取近似值

题目描述:取近似值

在这里插入图片描述

解题思路:
1.我们要理解当浮点数强制类型转化为整型时,它是只向上调整的,并不会进行四舍五入的操作。

2.因此我们可以先将浮点数加上0.5,然后在进行强制类型转换。如果小数部分大于或等于 0.5,则加上 0.5 后会触发向上取整;若小数部分小于0.5,则加上 0.5 后不会触发向上取整。(这一方法只适用于浮点数为正数时)

代码实现:

#include <stdio.h>int main() {int ret = 0;float n;scanf("%f",&n);printf("%d\n",(int)(n + 0.5));
}

🏝️六、数列

题目描述:数列

在这里插入图片描述

解题思路:
1.定义一个足够大的数组 arr,用于存储生成的伪随机数序列,将数组的前两个元素初始化为 1 和 2。

2.使用循环从第 3 个元素开始,根据递推公式生成后续的序列值,每个元素的值由前两个元素计算得出,并对 32767 取模,以确保值不会超出 long 类型的范围。

3.由于数组索引从 0 开始,而用户输入的索引从 1 开始,因此需要将用户输入的索引值减 1,以获取对应的数组元素。

代码实现:

#include <stdio.h>int main() {long arr[1000000] = {1,2};for(int i= 2;i<1000000;i++){arr[i] = (arr[i-1] * 2 + arr[i-2]) % 32767;}long n;scanf("%ld",&n);for(int i = 0;i<n;i++){int num;scanf("%d",&num);printf("%ld\n",arr[num-1]);}return 0;
}

🚆七、搜索插入位置

题目描述:搜索插入位置

在这里插入图片描述

解题思路:
1.定义两个指针 low 和 high,分别指向数组的起始位置和结束位置。定义一个变量 tmp,用于存储每次二分查找的中间索引。

2.使用 while 循环进行二分查找,计算中间索引 tmp。比较目标值 target 与中间值 nums[tmp]

3.如果循环结束仍未找到目标值,说明目标值不存在于数组中。如果目标值小于所有数组元素,low 会保持为0;如果目标值大于所有数组元素,low 会逐渐增加到 numsSize;如果目标值位于数组的某个位置之间,low 会停在目标值应该插入的位置。

代码实现:

int searchInsert(int* nums, int numsSize, int target) {int low = 0;int high = numsSize - 1;int tmp = 0;while(low <= high){tmp = (low + high)/2;if(nums[tmp] == target){return tmp;}else if(nums[tmp] >target){high = tmp - 1;}else{low = tmp + 1;}}return low;
}

🚘八、搜索旋转排序数组

题目描述:搜索旋转排序数组

在这里插入图片描述

解题思路:
1.首先要找到旋转点,使用二分查找的方法。如果 nums[0] > nums[numsSize - 1],说明数组确实被旋转了。

2.每次比较 nums[mid] 和 nums[left],如果 nums[mid] > nums[left],说明 mid 在前半部分的升序子数组中,旋转点在右半部分。否则,旋转点在左半部分。最终,left 和 right 会收敛到旋转点的位置。

3.确定查找范围。找到旋转点后,根据目标值 target 的大小,确定在哪个子数组中进行查找。如果 target 在前半部分的范围内,则在前半部分进行查找;否则,在后半部分进行查找。

4.使用标准的二分查找算法在选定的子数组中查找目标值。如果循环结束仍未找到目标值,则返回 -1。

代码实现:

int search(int* nums, int numsSize, int target) {int left = 0,right = numsSize - 1;int mid = numsSize - 1;while(nums[0] > nums[numsSize - 1] && left < right){mid = (left + right) / 2;if(nums[mid] >nums[left]){left = mid;}else{right = mid;}}//前半部分查找if(nums[0] <= target){left = 0,right = mid;}//后半部分查找else{left = mid + 1,right = numsSize - 1;}while(left <= right){mid = (left + right) / 2;if(nums[mid] == target){return mid;}else if(nums[mid] < target){left = mid + 1;}else{right = mid - 1;}}return -1;
}

🏖️九、二进制链表转整数

题目描述:二进制链表转整数

在这里插入图片描述

解题思路:
1.使用一个指针 pcur 遍历链表,统计链表的节点个数。

2.再次从头节点开始遍历链表,计算二进制数的十进制值。

3.将每个节点的值乘以对应的权重 2 的(count−1)次方 ,权重从最高位开始计算,因此每次遍历时 count 减 1。将每个节点的值累加到结果 ret 中。

4.遍历完成后返回目标值ret即可。

代码实现:

typedef struct ListNode ListNode;
int getDecimalValue(struct ListNode* head) {ListNode* pcur = head;int count = 0;int ret = 0;//记录链表的结点个数while(pcur){count++;pcur = pcur->next;}pcur = head;//再次从头开始遍历链表,计算结果while(pcur){   ret += (pcur->val) * pow(2,count - 1);count--;pcur = pcur->next;}return ret;
}

今天的分享就到这里啦,如果感到不错,希望能给博主一键三连,感谢大家的支持!希望这篇文章可以帮到大家,我们下期再见!

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

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

相关文章

MySQL----数据库的操作

1. 查看数据库 语法&#xff1a;show databases; 示例展示&#xff1a; 2. 创建库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name[CHARACTER SET charset_name][COLLATE collation_name]; 注意&#xff1a;[] 为可选项 {} 为必选项 database_name 为数据…

Dagger中编译import报找不到ProvideClientFactory,initialize中ProvideClientFactory爆红

解决方案&#xff1a;将对应Module移到主模块&#xff0c;可能是依赖循环使用导致或者是模块之间无法访问及通信导致 为了重现问题&#xff0c;我还远了此操作

Nacos源码—4.Nacos集群高可用分析四

大纲 6.CAP原则与Raft协议 7.Nacos实现的Raft协议是如何写入数据的 8.Nacos实现的Raft协议是如何选举Leader节点的 9.Nacos实现的Raft协议是如何同步数据的 10.Nacos如何实现Raft协议的简版总结 8.Nacos实现的Raft协议是如何选举Leader节点的 (1)初始化RaftCore实例时会开…

拟南芥T2T基因组-文献精读127

A near-complete assembly of an Arabidopsis thaliana genome 拟南芥基因组的近乎完整组装 拟南芥&#xff08;Arabidopsis thaliana&#xff09;基因组序列作为广泛应用的模式物种&#xff0c;为植物分子生物学研究提供了巨大的推动力。在基因组序列首次发布后的20多年&…

一个关于fsaverage bem文件的说明

MNE文档&#xff1a;基于模板 MRI 的 EEG 前向算子 Head model and forward computation 在了解了脑图谱发展的过程之后&#xff0c;对脑的模版有了更深的认识&#xff0c;所以&#xff0c;对于之前使用的正向的溯源文件&#xff0c;进行一下解析&#xff0c;查看包含的信息&a…

C#学习第21天:安全与加密(Security and Cryptography)

核心概念 1. 什么是加密&#xff1f; 加密&#xff1a;加密是一种将数据转换为一种不可读形式的方法&#xff0c;只有持有相应密钥的人才能解密并读取数据。目的&#xff1a;确保数据的机密性和安全性&#xff0c;特别是在传输过程中过防止未授权访问。 2. 加密类型 对称加密…

OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用一个通用的几何变换。 函数 remap 使用指定的映射对源图像进行变换&#xff1a; dst ( x , y ) src ( m a p x ( x , y ) , m a p y…

在线时间戳转换工具

给大家推荐一个在线时间戳转换工具 点击跳转-鸽鸽在线工具 这个工具除了时间戳转换&#xff0c;到首页还能选择使用很多其他小工具&#xff0c;欢迎使用

WPF之面板特性

文章目录 1. 概述2. WPF布局系统基础2.1 布局过程概述2.2 布局重新计算的触发条件2.3 布局重新计算的核心方法 3. WPF内置面板类型及特性3.1 面板类型概览3.2 Canvas面板3.3 StackPanel面板3.4 WrapPanel面板3.5 DockPanel面板3.6 Grid面板3.7 UniformGrid面板3.8 Virtualizing…

【技术追踪】通过潜在扩散和先验知识增强时空疾病进展模型(MICCAI-2024)

向扩散模型中引入先验知识&#xff0c;实现疾病进展预测&#xff0c;扩散模型开始细节作业了~ 论文&#xff1a;Enhancing Spatiotemporal Disease Progression Models via Latent Diffusion and Prior Knowledge 代码&#xff1a;https://github.com/LemuelPuglisi/BrLP 0、摘…

[ linux-系统 ] 常见指令2

1. man 指令 语法&#xff1a;man [选项] 命令 功能&#xff1a;查看联机手册获取帮助。 选项说明-k根据关键字搜索联机帮助。num只在第num章节找。-a显示所有章节的内容。 man是 Unix 和类 Unix 系统中的一个命令&#xff0c;用于查看操作系统和软件的手册页面&#xff08;ma…

STL之stackqueue

stack的介绍&#xff08;可以想象成栈&#xff09; 1.stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作 2.stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特点类封装作为其…

【现代深度学习技术】现代循环神经网络06:编码器-解码器架构

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

宏电全新升级单北斗5G电力DTU,为每一公里电力线路注入可靠连接

在配网自动化改造与数字化转型的双重驱动下&#xff0c;宏电股份推出全新升级版H7710-DLWZ系列5G电力DTU&#xff0c;聚焦配网通信链路冗余、国产自主可控、复杂环境适应性三大核心需求&#xff0c;为配电自动化、台区智能运维、分布式能源接入等场景提供高可靠通信底座。 国产…

学习海康VisionMaster之间距检测

一&#xff1a;进一步学习了 今天学习下VisionMaster中的间距检测工具&#xff1a;主要类似于卡尺工具&#xff0c;测量物体的长度或者宽度或者间距 二&#xff1a;开始学习 1&#xff1a;什么是间距检测&#xff1f; 间距测量模块用于检测两特征边缘之间的间距&#xff0c;首…

蓝桥杯 18. 积木

积木 原题目链接 题目描述 小明用积木搭了一个城堡。为了方便&#xff0c;小明使用的是大小相同的正方体积木&#xff0c;并将其搭建在一个 n 行 m 列的方格图上。每个积木占据方格图中的一个小格子。 小明的城堡是立体的&#xff0c;可以将积木垒在其他积木上。当某个格子…

C++负载均衡远程调用学习之基础TCP服务

目录 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 3.LARS的reactor框架的组成部分 4.Lars_reactor的项目目录构建 5.Lars_tcp_server的基础服务开发 6.Lars_tcp_server的accept实现 7.LarsV0.1总结 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 # Lars系统开发 …

EasyExcel使用总结

EasyExcel 文章目录 EasyExcel1、导入1.1、基本方式导入1.导入依赖2. 加载源文件基本语法 3. 读取数据行4. 读取结果 1.2、模型映射导入1.定义实体映射类2. 操作读取基本语法 3. 读取数据行4. 读取结果 1.3、导入类型转换器语法 1.4、导入监听器基本语法&#xff1a; 1.5、多行…

【愚公系列】《Manus极简入门》022-艺术创作顾问:“艺术灵感使者”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

蓝桥杯15届国赛 最小字符串

问题描述 给定一个长度为 N 且只包含小写字母的字符串 S&#xff0c;和 M 个小写字母 c1,c2,...,cM​。现在你要把 M 个小写字母全部插入到字符串 S 中&#xff0c;每个小写字母都可以插入到任意位置。请问能得到的字典序最小的字符串是什么&#xff1f; 输入格式 第一行包含…