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…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...