数据结构OJ题

目录

1.字符串左旋 

2.字符串旋转结果

3.旋转数组

4.移除元素


本篇主要是讲解一些OJ题目。

1.字符串左旋 

字符串左旋

实现一个函数,可以左旋字符串中的k个字符

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

方法1【暴力求解】

  • 翻转1个字符
  1. 创建一个中间变量tmp,用于存储翻转的字符
  2. 把后面的字符向前覆盖移动
  3. 把tmp存储的字符放到结尾
  • 翻转k个字符,循环k次即可 
  • 注意如果旋转超出数组的元素个数范围,需要现处理一下。k=%len
#include<stdio.h>
void left_move(char* arr, int sz,int k)
{int i = 0;for (i = 0; i < k; i++)//k次{//一次翻转char tmp = 0;//1.tmp = *arr;int j = 0;//2.for (j = 0; j < sz - 2; j++){arr[j] = arr[j + 1];}arr[sz - 2] = tmp;//3.}
}
int main()
{char arr[] = "ABCDEF";int sz = sizeof(arr) / sizeof(arr[0]);//计算了\0int k = 0;scanf_s("%d", &k);k = k % (sz - 1);left_move(arr, sz,k);printf("%s", arr);return 0;
}


方法2【三步翻转】

  • 左边逆序
  • 右边逆序
  • 整体逆序
  • 封装一个逆序字符串的函数,传不同的起尾位置,调用三次函数即可
  • 注意如果旋转超出数组的元素个数范围,会造成数组越界的问题,需要现处理一下。k=%len
#include<stdio.h>
//逆序字符串函数
void reverse(char* begin, char* end)
{while (begin < end){char tmp = 0;tmp = *begin;*begin = *end;*end = tmp;begin++;end--;}
}
int main()
{char arr[] = "ABCDEF";int sz = sizeof(arr)/sizeof(arr[0]);int k = 0;scanf_s("%d", &k);k = k % (sz - 1);//必须有不然会数组越界reverse(arr, arr + k-1);reverse(arr + k, arr + sz - 2);reverse(arr, arr + sz - 2);printf("%s", arr);return 0;
}


2.字符串旋转结果

字符串旋转结果

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:

给定s1= AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ABCD,返回0

方法1【暴力求解】

  • 旋转1次比较1次
  • 把所有结果都列出来一一比较,如果没有那就返回0.
  • 注意:如果两个数组的长度不一样,是肯定不会旋转得到的,需要处理一下。
#include<stdio.h>
#include<string.h>
#include<assert.h>
int is_left_move(char* arr1, const char* arr2)
{assert(arr1 && arr2);int len1 = strlen(arr1);int len2 = strlen(arr2);if (len1 != len2){return 0;}int i = 0;//这里如果用while  len是变化的for(i=0;i<len1;i++){//一次翻转char tmp = 0;//1.tmp = *arr1;int j = 0;//2.for (j = 0; j < len1 - 1; j++){arr1[j] = arr1[j + 1];}arr1[len1 - 1] = tmp;//3//判断if (strcmp(arr1, arr2) == 0){return 1;}}return 0;
}
int main()
{char arr1[] = "ABCDEF";char arr2[] = "CDEFAB";int ret=is_left_move(arr1, arr2);if (ret == 1){printf("YES");}else{printf("NO");}return 0;
}

 


方法2【追加找子串 】

  • 把原字符串数组arr1追加,这样翻转所有的可能性都在追加字符串里
  • 再去arr1追加字符串里找子串arr2,看是否和要比较字符串数组arr2,相符号的。
  • 注意:如果两个数组的长度不一样,是肯定不会旋转得到的,需要处理一下。
#include<stdio.h>
#include<string.h>
#include<assert.h>
int is_left_move(char* arr1, const char* arr2)
{assert(arr1 && arr2);int len1 = strlen(arr1);int len2 = strlen(arr2);if (len1 != len2){return 0;}int len = strlen(arr1);strncat(arr1, arr1, len);if (strstr(arr1, arr2) == NULL)return 0;elsereturn 1;
}
int main()
{char arr1[] = "ABCDEF";char arr2[] = "CDEFAB";int ret=is_left_move(arr1, arr2);if (ret == 1){printf("YES");}else{printf("NO");}return 0;
}


3.旋转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]

方法1【暴力求解】

同上

时间复杂度:O(N^2)

#include<stdio.h>
#include<string.h>
#include<assert.h>
void right_move(char* arr,int k)
{assert(arr);int len = strlen(arr);k%=len;int i = 0;for (i = 0; i < k; i++){int j = 0;char tmp = arr[len - 1];for (j = len-1; j >0; j--){arr[j] = arr[j -1];}*arr = tmp;}
}
int main()
{char arr[] = "ABCDEF";int k = 0;scanf("%d", &k);right_move(arr,k);printf("%s", arr);return 0;
}


方法2【三步翻转】

界限:需要右旋&不需要右旋的逆置,整体逆置

时间复杂度:O(N) 

#include<stdio.h>
//逆序字符串函数
void reverse(char* begin, char* end)
{while (begin < end){char tmp = 0;tmp = *begin;*begin = *end;*end = tmp;begin++;end--;}
}
int main()
{char arr[] = "ABCDEF";int len = strlen(arr);int k = 0;scanf_s("%d", &k);k = k % len;//必须有不然会数组越界reverse(arr,arr+len-k-1);reverse(arr+len-k,arr+len-1);reverse(arr,arr+len-1);printf("%s", arr);return 0;
}

方法3【以时间换空间】

  • 先拷贝前len-k个到后面位置
  • 再拷贝k个 到前面位置
  • 最后拷贝回去
  • 变长数组和动态内存开辟的数组都可
  • 关键就是下标和位置一定一定控制清楚
  • 时间复杂度:O(N)       空间复杂度:O(N)

void rotate(int* nums, int numsSize, int k)
{int tmp[numsSize];int i=0;k%=numsSize;//就这个代码卡了我一下午,有时候真的很无助for(i=0;i<k;i++){*(tmp+i)=*(nums+numsSize-k+i);}for(i=0;i<numsSize-k;i++){*(tmp+k+i)=*(nums+i);}for(i=0;i<numsSize;i++){*(nums+i)=*(tmp+i);}
}

 


4.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

方法1【暴力求解】

  • 首先遍历数组一遍找到元素
  • 从后向前依次覆盖
  • 时间复杂度:O(N^2)
int removeElement(int* nums, int numsSize, int val)
{int i=0;for(i=0;i<numsSize;i++){if(nums[i] == val){for(;i<numsSize-i;i++)//❌nums[i]=nums[i+1];}}return numsSize;
}

方法2【以空间换时间】

  • 创建一个一摸一样的数组tmp
  • 把是val的数值元素留下,不是的拷贝到tmp中
  • 最后把tmp拷贝到nums里面去
  • 时间复杂度:O(N)

 但是我们发现,题目要求不允许这么做?怎么办呢? 


方法3【方法2的优化】

那我们选择就在nums的基础上实现tmp等的功能。

  • 使用src指针和des指针
  • 时间复杂度O(N)

int removeElement(int* nums, int numsSize, int val){
int src=0;
int dst=0;
while(src<numsSize)
{if(nums[src] != val){nums[dst++]=nums[src++];}else{src++;}
}return dst;
}

【暴力求解】&【三步翻转】 

【注意】 

  • len&sz
  • 指针&数组下标
  • 如果找错了位置或者减少了都会发生错误❌

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正! 棠棣

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

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

相关文章

[hadoop全分布部署]安装Hadoop、配置Hadoop 配置文件②

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;安装Hadoop、配置Hadoop 配置文件…

MySQL总结 (思维导图,常用)

一、常见的增删改查 二、约束&#xff08;五种&#xff09; 三、聚合查询 1、聚合函数 2、group by 和 having 3、联合查询 案例表&#xff1a; drop table if exists classes; create table classes (id int primary key auto_increment,name varchar(20) ); insert into …

2023.10.28 关于 synchronized 原理

目录 synchronized 特性 synchronized 优化机制 锁升级&#xff08;锁膨胀&#xff09; 其他优化机制 锁消除 锁粗化 synchronized 特性 开始时是乐观锁&#xff0c;如果锁冲突频繁&#xff0c;就转为悲观锁开始是轻量级锁&#xff0c;如果锁被持有的时间较长&#xff0c…

大厂面试题-JVM为什么使用元空间替换了永久代?

目录 面试解析 问题答案 面试解析 我们都知道Java8以及以后的版本中&#xff0c;JVM运行时数据区的结构都在慢慢调整和优化。但实际上这些变化&#xff0c;对于业务开发的小伙伴来说&#xff0c;没有任何影响。 因此我可以说&#xff0c;99%的人都回答不出这个问题。 但是…

k8s快速部署nacos2.2.0集群

nacos2.2.0集群部署。nacos-headless内部集群端口服务&#xff0c;nacos-service为了方便ingress转发提供给用户web界面操作&#xff0c;requiredDuringSchedulingIgnoredDuringExecution强制反亲和禁止同一个节点部署nacos实列。 1、数据库导入nacos的sql # 创建数据库 crea…

Python 编写 Flink 应用程序经验记录(Flink1.17.1)

目录 官方API文档 提交作业到集群运行 官方示例 环境 编写一个 Flink Python Table API 程序 执行一个 Flink Python Table API 程序 实例处理Kafka后入库到Mysql 下载依赖 flink-kafka jar 读取kafka数据 写入mysql数据 flink-mysql jar 官方API文档 https://nigh…

离线语音通断器开发-稳定之后顺应新需求

使用云知声的US516p6方案开发了一系列的离线语音通断器&#xff0c;目前已经取得了不小的收获&#xff0c;有1路的&#xff0c;3路的&#xff0c;4路的&#xff0c;唛头和扬声器包括唛头线材也在不断的更新打磨中找到了效果特别好的供应商。 离线语音通断器&#xff0c;家用控…

单目深度估计之图像重构原理解析

一、参考资料 浅析自监督深度估计中的光度损失(Photometric Loss) 二、图像重构原理 设输入位姿估计网络的3帧连续单目序列为 < I t − 1 , I t , I t 1 > <I_{t-1},I_{t},I_{t1}> <It−1​,It​,It1​>&#xff0c;其中 t t t 为时间索引&#xff0c;…

R语言代码示例

以下是一个使用R语言和httrOAuth库的下载器程序&#xff0c;用于下载的内容。程序使用以下代码。 # 安装和加载必要的库 install.packages("httr") install.packages("httrOAuth") library(httr) library(httrOAuth) ​ # 设置 http_proxy <- "du…

docker - window Docker Desktop升级

文章目录 前言docker - window Docker Desktop升级 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来…

大厂面试题-JVM中的三色标记法是什么?

目录 问题分析 问题答案 问题分析 三色标记法是Java虚拟机(JVM)中垃圾回收算法的一种&#xff0c;主要用来标记内存中存活和需要回收的对象。 它的好处是&#xff0c;可以让JVM不发生或仅短时间发生STW(Stop The World)&#xff0c;从而达到清除JVM内存垃圾的目的&#xff…

Java 入门指南:使用 Docker 创建容器化 Spring Boot 应用程序

文章目录 步骤 1: 准备工作步骤 2: 克隆 Spring Boot 应用程序步骤 3: 创建 Dockerfile步骤 4: 构建 Docker 映像步骤 5: 运行容器步骤 6: 链接到本地数据库步骤 7: 使用 Docker Compose 运行多个容器步骤 8: 设置 CI/CD 管道结论 &#x1f388;个人主页&#xff1a;程序员 小侯…

Bayes决策:身高与体重特征进行性别分类

代码与文件请从这里下载&#xff1a;Auorui/Pattern-recognition-programming: 模式识别编程 (github.com) 简述 分别依照身高、体重数据作为特征&#xff0c;在正态分布假设下利用最大似然法估计分布密度参数&#xff0c;建立最小错误率Bayes分类器&#xff0c;写出得到的决…

驱动开发7 基于GPIO子系统编写LED驱动,编写应用程序进行测试设置定时器,5秒钟打印一次hello world

驱动代码 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/timer.h> #include <linux/of_irq.h> #include <linux/interrupt.h…

Java 四种引用类型

文章目录 前言一、整体架构二、强引用&#xff08;Reference&#xff09;三、软引用&#xff08;SoftReference&#xff09;四、弱引用&#xff08;WeakReference&#xff09;五、虚引用&#xff08;PhantomReference&#xff09;六、引用队列&#xff08;ReferenceQueue&#…

GZ035 5G组网与运维赛题第3套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第3套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

软件测试---等价类划分(功能测试)

能对穷举场景设计测试点-----等价类划分 等价类划分 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分分类&#xff1a; 1&#xff09;有效等价类 2&#xff09;无效等价类步骤&#xff1a;1&#xff09;明确需求 2&#xff09;确定有效和无…

【面试经典150 | 链表】两数相加

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到…

J2EE项目部署与发布(Windows版本)->会议OA单体项目Windows部署,spa前后端分离项目Windows部署

会议OA单体项目Windows部署spa前后端分离项目Windows部署 1.会议OA单体项目Windows部署&#xff08;以实施的角度&#xff09; 将项目放入webapp&#xff0c;项目能够访问: 首先拿到war包和数据库脚本&#xff0c;并检查是否有什么问题。 如何查看项目报错信息&#xff08;当你…

嵌入式中的MCU、ARM、DSP、FPGA

目录 “角色扮演” MCU ARM 特点 DSP 特点 FPGA 特点 应用 “角色扮演” MCU&#xff08;Microcontroller Unit&#xff09;、ARM&#xff08;Advanced RISC Machine&#xff09;、DSP&#xff08;Digital Signal Processor&#xff09;和FPGA&#xff08;Field-Progr…