C语言练习题第三弹!!!绝对典中典!!!
目录
1.单身狗1
1.1 题目
1.2 分析推理
1.3 代码实现
2.单身狗2
2.1 题目
2.2 分析推理
2.3 代码实现
3.字符串左旋
3.1 题目
3.2 分析推理
3.3 代码实现
3.3.1 方法一
3.3.2 优化一
3.3.2.1 思路分析
3.3.2.2 strcpy函数和strncat函数
3.3.2.3 代码实现
3.3.3 优化二
3.3.3.1 思路分析
3.3.3.2 代码实现
4.字符串旋转结果
4.1 题目
4.2 分析推理
4.3 代码实现
1.单身狗1
1.1 题目
在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。
例如:
数组中有:1 2 3 4 5 1 2 3 4,只有5出现一次,其他数字都出现2次,找出5
1.2 分析推理
这里我们借助一个操作符:^ ----按位异或--->对应的二进制位上相同则为0,相异则为1
满足交换律;eg:1^2 ^1=2
类似消消乐一样
那我们顺着这个思路往下,就可以将整个数组的元素都^ ,最后的结果就是我们要找的单身狗
1.3 代码实现
#include<stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);int ret = 0;for (int i = 0; i < sz; i++){ret ^= arr[i];}printf("单身狗是%d", ret);return 0;
}

2.单身狗2
2.1 题目
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6
只有5和6只出现1次,要找出5和6.
2.2 分析推理
我们发现刚刚把里面所有的数字都异或一遍,利用异或的方法不成立了。如果有两个数字都只出现了一次,那么如此得到的应该是两个数异或的结果。
例子中异或的结果也就是5^ 6=0011
在单身狗1的基础上,我们再来想想办法:
首先这个结果肯定不是0(要不然就全都配对了),所以里面一定至少一位是一。找出值为1的一位,以这一位的值将结果分为两组。这样的话,就可以延用单身狗1的方法了。
例如1 2 3 4 1 2,异或完的结果应该是3^4得到的111,那么随便找一位就行了。例如找最低位,那么这最低位是1的有1 3 1,最低位是0的有2 4 2,由于是利用异或结果为1的某一位分的组,所以两个待查询数字一定分别在两组中。所以再找两个变量,分别异或两组数,即可找到这两个数。

2.3 代码实现
#include<stdio.h>
void findnum(int arr[], int sz, int* ret1, int* ret2)
{//整体异或int ret = 0;for (int i = 0; i < sz; i++){ret ^= arr[i];}//找到何处为1int pos = -1;//位置上的值不是0就是1,-1可以避免影响//从右往左,遇到1,就记录1的位置for (int i = 0; i < 32; i++){if ((ret & 1) == 1)//&---按位与--->全1则为1,有0则0{pos = i;//记录1所在位置break;}}//分组分别异或for (int i = 0; i < sz; i++){if ((arr[i] >> pos) & 1)//右移pos位找到pos位上的值按位与{*ret1 ^= arr[i];}else{*ret2 ^= arr[i];}}
}
int main()
{int arr[] = { 1,2,3,4,5,6,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);//返回值int ret1 = 0;int ret2 = 0;findnum(arr, sz, &ret1, &ret2);//传址printf("单身狗是%d,%d\n", ret1, ret2);return 0;
}

3.字符串左旋
3.1 题目
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
3.2 分析推理
设计循环使其可以旋1次,然后让他执行n次是一个最简单的思路:一个一个慢慢挪
我们按照下标顺序一个一个将第一个下标对应的字符现存放到tmp空间,再将tmp中存放的字符放到数组最后一个下标对应的位置,以此类推:
但是,值得注意的是多次左旋结果可能相同
例如:ABCD---4个字符--->左旋1,5,9......等次数的结果一样--->BCDA

3.3 代码实现
3.3.1 方法一
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void leftround(char* arr, int len, int time)
{int tmp,i,j;//左旋次数time %= len;//左旋循环趟数for (i = 0; i < time; i++){tmp = arr[0];//将第一个坐标对应的字符放到tmp空间for (j = 0; j < len - 1; j++)//j+1<4-->j<3{//后面的覆盖到前面arr[j] = arr[j + 1];}arr[j] = tmp;}
}
int main()
{char arr[] = "ABCD";int time = 0;scanf("%d\n", &time);int len = strlen(arr);leftround((char*)arr, len, time);printf("%s\n", arr);return 0;
}

3.3.2 优化一
3.3.2.1 思路分析
改进一:
这个思路当然可以,但是一次一次转毕竟太麻烦,就不能一次到位么?
当然可以,我们可以选择拼接法(需要借助库函数),一次到位:
我们先将移动k次之后的剩余的字符挪到tmp空间存放,再将移动k次涉及到的字符拷到tmp空间中刚刚字符的后面,最后拷到原数组中

3.3.2.2 strcpy函数和strncat函数


3.3.2.3 代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void leftround(char* arr, int len, int time)
{//左旋次数time %= len;char tmp[200] = {0};strcpy(tmp, arr + time);//将不涉及左旋的字符全部拷到tmpstrncat(tmp, arr, time);//将涉及到左旋的字符拼接到前面strcpy(arr, tmp);//最后拷回去原数组
}
int main()
{char arr[] = "ABCD";int time = 0;scanf("%d\n", &time);int len = strlen(arr);leftround((char*)arr, len, time);printf("%s\n", arr);return 0;
}

3.3.3 优化二
3.3.3.1 思路分析
改进二:
方法二要用到一个数组形成的辅助空间,让人觉得有点不爽,还可以有更好的选择,例如ABCDEFG,左旋3次后变成DEFGABC,有一个特殊的操作方式:局部翻转
先将要左旋的前三个家伙逆序(翻转)ABCDEFG--->CBADEFG,然后将后半段也逆序(翻转)CBADEFG--->CBAGFED,最后整体逆序(翻转)CBAGEFD-->DEFGABC即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序
3.3.3.2 代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void resrve_part(char* arr, int start, int end)
{//交换位置---翻转倒序while (start < end){char tmp = arr[start];arr[start] = arr[end];arr[end] = tmp;start++;end--;}
}
void leftround(char* arr, int len, int time)
{//左旋次数time %= len;resrve_part(arr, 0, time - 1);//翻转前半部分resrve_part(arr, time, len-1);//翻转后半部分resrve_part(arr, 0, len-1);//全部翻转
}
int main()
{char arr[] = "ABCD";int time = 0;scanf("%d\n", &time);int len = strlen(arr);leftround((char*)arr, len, time);printf("%s\n", arr);return 0;
}

4.字符串旋转结果
4.1 题目
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
4.2 分析推理
本题最简单的思路就是可以将所有旋转后的结果放到一个数组里,然后进行查找:利用左旋的方法每左旋一次就去对比是否一样(共左旋len次,之后左旋结果重复)
这里我们需要介绍一个用于比较不同的函数---strcmp函数

4.3 代码实现
4.3.1 方法一
#include<stdio.h>
#include<string.h>
int findnum(char* arr1, char* arr2, int len)
{int i, j, tmp;for (i = 0; i < len; i++){tmp = arr1[0];for (j = 0; j < len - 1; j++){arr1[j] = arr1[j + 1];}arr1[j] = tmp;if (strcmp(arr1, arr2) == 0){return 1;}}return 0;
}
int main()
{char arr1[] = "AABCD";char arr2[] = "ABDCA";int len = strlen(arr1);int ret = findnum((char*)arr1, (char*)arr2, len);printf("%d", ret);return 0;
}

4.3.2 优化
4.3.2.1 思路分析
但是方法一这种做法既不好操作,也太费事,但是这题有一个很简单的做法---拼接法(借助库函数):
其实AABCD无论怎么旋,旋转后的所有结果,都包含在了AABCDAABCD这个字符串里了。
所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。
但是我们需要借助库函数实现

4.3.2.2 strcat函数和strstr函数


4.3.2.3 代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int findnum(char* arr1, char* arr2)
{char tmp[200] = { 0 };strcpy(tmp, arr1);//初始化字符串拷到tmpstrcat(tmp, arr1);//自己拼接自己return strstr(tmp, arr2) != NULL;//能否找到
}
int main()
{char arr1[] = "AABCD";char arr2[] = "DCBAA";int ret = findnum((char*)arr1, (char*)arr2);printf("%d", ret);return 0;
}

到这里,第二弹练习就结束了
PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!
如果对你有帮助的话,记得点赞👍+收藏⭐️+关注➕

相关文章:
C语言练习题第三弹!!!绝对典中典!!!
目录 1.单身狗1 1.1 题目 1.2 分析推理 1.3 代码实现 2.单身狗2 2.1 题目 2.2 分析推理 2.3 代码实现 3.字符串左旋 3.1 题目 3.2 分析推理 3.3 代码实现 3.3.1 方法一 3.3.2 优化一 3.3.2.1 思路分析 3.3.2.2 strcpy函数和strncat函数 3.3.2.3 代码实现 3.3.…...
Jedis
Jedis 使用Java操作redis Jedis是redis官方推荐的Java连接开发工具! 使用Java操作redis的中间件 测试 导入对应的依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId&g…...
Linux 使用TCP_INFO查询TCP连接的状态信息
Linux 上可以使用TCP_INFO查询TCP连接状态信息包括: 发送方拥塞窗口阈值、发送方缓冲区拥塞窗口、advmss(Advertised MSS)、通过 ACK 确认的累计字节数等等 struct tcp_info {__u8 tcpi_state;__u8 tcpi_ca_state;__u8 tcpi_retransmits;__…...
软件测试案例 | 气象探测库存管理系统的集成测试计划
将经过单元测试的模块按照设计要求连接起来,组成规定的软件系统的过程被称为“集成”。集成测试也被称为组装测试、联合测试、子系统测试或部件测试等,其主要用于检查各个软件单元之间的接口是否正确。集成测试同时也是单元测试的逻辑扩展,即…...
vue点击按钮重新加载页面(vue第一次加载页面点击按钮出现页面刷新问题之后一切正常)
问题描述 所开发的vue项目每次跑起来之后就会出现点击按钮后重新加载整个页面的问题,但是只会在第一次点击的时候出现,后面就不会在出现加载整个页面的情况。 原因 在form表单中使用button按钮导致form表单进行了页面刷新。button默认的“type‘submi…...
软件工程(十一) 系统设计分类
我们知道需求规格说明书(SRS)落地之后, 就要开始着手系统设计了,看一下这个系统该如何来设计,并且如何实现。学习系统设计之前,需要先了解系统设计有哪些分类。 系统设计的分类如下 界面设计结构化设计面向对象设计(最重要)1、界面设计 界面设计也叫做人机界面设计,属于…...
数字转中文大写金额
有时候,我们需要显示中文大写金额,比如打印银行付款申请单等。 新建一个工程,加入一个标准模块在模块中加入如下代码,窗口中调用 AmountInChineseWords 函数即可。最大解析到百万亿,小数最多解析两位到分。 模块代码…...
Java——HashMap和HashTable的区别
Java——HashMap和HashTable的区别 Java HashMap和HashTable的区别1. 继承的父类2. 线程安全性3. null值问题4. 初始容量及扩容方式5. 遍历方式6. 计算hash值方式 Java HashMap和HashTable的区别 1. 继承的父类 都实现了Map、Cloneable(可复制)、Seria…...
Docker去除sudo权限
Docker去除sudo权限 使用docker命令时,每次都要sudo提权,否则就会报错提示无权限。 1.查看docker用户组及成员 sudo cat /etc/group | grep docker2.添加docker用户组 sudo groupadd docker3.添加用户到docker组 sudo gpasswd -a ${USER} docker4.增…...
【ROS系统】Ubuntu22.04系统中安装ROS2系统_ubuntu 安装ros2_GoesM
【ROS系统】Ubuntu22.04系统中安装ROS2系统_ubuntu 安装ros2_GoesM Excerpt ROS仿真、专为自动驾驶研发提供的系统平台_ubuntu 安装ros2 参考博客:ROS 安装详细教程 —— Ubuntu22.0.4 LTS 安装 Part 0. 准备 首先,我们需要一个Ubuntu系统。 Part 1. …...
MySQL8.0.22安装过程记录(个人笔记)
1.点击下载MySQL 2.解压到本地磁盘(注意路径中不要有中文) 3.在解压目录创建my.ini文件 文件内容为 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] # 设置端口 port 3306 # 设计mysql的安装路径 basedirE:\01.app\05.Tool…...
Python中pip和conda的爱恨情仇
在使用pip和conda时,是否也有过以下的疑惑??? 目前只总结了以下常见的几种混淆,如有学者还有其它疑惑,欢迎留言讨论,我会解答更新,帮助自己理清的同时,也帮助其他同样困…...
HTTPS协议原理
目录 前言 1.理解加密和解密 2.为什么要加密 3.常见的加密方式 3.1对称加密 3.2非对称加密 4.数据摘要和数据指纹 5. 数字签名 6.HTTPS的加密策略 6.1只使用对称加密 6.2使用非对称加密 6.2.1服务端使用非对称加密 6.2.2双方都使用非对称加密 6.3对称加密非对称加…...
C语言每日一练------Day(6)
本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字:整数转换 异或 💓博主csdn个人主页:小小unicorn…...
springboot中使用ElasticSearch
引入依赖 修改我们的pom.xml,加入spring-boot-starter-data-elasticsearch <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>编写配…...
十二、集合(2)
本章概要 添加元素组集合的打印列表 List 添加元素组 在 java.util 包中的 Arrays 和 Collections 类中都有很多实用的方法,可以在一个 Collection 中添加一组元素。 Arrays.asList() 方法接受一个数组或是逗号分隔的元素列表(使用可变参数ÿ…...
【网络设备】交换机的概念、工作原理、功能以及以太网帧格式
个人主页:insist--个人主页 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、认识交换机 二、交换机的主要功能 1、数…...
研磨设计模式day11观察者模式
目录 场景 代码示例 定义 观察者模式的优缺点 本质 何时选用 简单变型-区别对待观察者 场景 我是一家报社,每当我发布一个新的报纸时,所有订阅我家报社的读者都可以接收到 代码示例 报纸对象 package day11观察者模式;import java.util.Observ…...
第八周第二天学习总结 | MySQL入门及练习学习第四天
实操练习: 1.建立一个员工表和与之对应的部门表 2.建立外键约束 3.使用多表查询,直接查询部门表和员工表 发现:有很多多余的因笛卡尔乘积而带来的多余输出内容 我想要的到简单明了的数据结果,要消除多于因笛卡尔乘积带来的输出…...
WPF数据转换
在基本绑定中,信息从源到目标的传递过程中没有任何变化。这看起来是符合逻辑的,但我们并不总是希望出现这种行为。通常,数据源使用的是低级表达方式,我们可能不希望直接在用户界面使用这种低级表达方式。WPF提供了两个工具&#x…...
Unity游戏资源提取实战指南:AssetStudio高阶用法与避坑手册
1. 这不是“又一个AssetStudio教程”,而是我拆了27款Unity手游后总结的资源提取生存手册AssetStudio、Unity游戏资源提取、Unity AssetBundle、Unity3D反编译——这几个词,过去三年里我每天至少在技术群、论坛、工单系统里看到50次。但绝大多数人点开Ass…...
xc-union 从 1.0.0 到 2.0.0:开源私域返利基座
618 拼的不只是流量,更是开发效率。 每到大促节点,很多团队都会集中遇到同一类需求: 查券/导购工具要尽快上线H5 页面先跑,后端接口后续持续扩展要求可快速交付,也要支持后续二开 问题是,如果从零开始手撸&…...
WT32-S3-DK开发板全解析:从硬件设计到物联网项目实战
1. 项目概述:一块“小而全”的物联网开发板最近在捣鼓一个智能家居的传感器节点项目,需要一块性能足够、接口丰富、最好还带屏幕的开发板。市面上ESP32-S3的方案很多,但要么是核心板,需要自己配底板和屏幕,要么就是功能…...
系统设计 012:从用户系统出发,吃透缓存、数据库与高并发设计
系统设计 012:从用户系统出发,吃透缓存、数据库与高并发设计Bilibili 同步视频一、用户系统,藏着后端设计的核心考点💡二、4S 分析法:先读懂用户系统的流量挑战📊1. Scenario:四大需求ÿ…...
2026免费在线去水印软件推荐:优缺点对比与测评
在2026年,处理带有水印的图片、视频和文档已经成为许多人日常工作中的常见需求。无论是内容创作者、自媒体运营者,还是普通用户,偶尔都需要从素材中移除水印。本文将全面介绍当前免费在线去水印软件的最新情况,帮助你了解各工具的…...
Spring Boot 项目标准化部署打包实战
Spring Boot 项目标准化部署打包实战 一、目标 将 Spring Boot 项目打包为开箱即用的生产环境部署包。用户解压后只需修改配置文件,运行启动脚本即可启动服务。 最终目录结构 your-app/ ├── bin/ │ ├── startup.sh # Linux 启动脚本 │ └── …...
【多通道滤波】基于最小均方(McFxLMS)算法用于自适应多通道有源噪声控制(MCANC)应用研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
专业级图片去重神器:彻底告别重复照片的数字困扰
专业级图片去重神器:彻底告别重复照片的数字困扰 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾经花费数小时手动整理电脑中堆积如山的重复照片&a…...
实测在ubuntu环境下调用taotoken api的延迟与稳定性表现
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测在ubuntu环境下调用taotoken api的延迟与稳定性表现 本文旨在分享在Ubuntu 22.04 LTS系统环境下,使用Python脚本持…...
如何快速掌握基因引物设计:Primer3-py 的完整入门指南
如何快速掌握基因引物设计:Primer3-py 的完整入门指南 【免费下载链接】primer3-py Simple oligo analysis and primer design 项目地址: https://gitcode.com/gh_mirrors/pr/primer3-py 在分子生物学研究中,高效准确的引物设计是实验成功的关键。…...
