数据结构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.mzph.cn/news/123292.shtml

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

相关文章

MSQL系列(八) Mysql实战-SQL存储引擎

Mysql实战-SQL存储引擎 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;我们一般都知道Mysql的存储引擎有两种&#xff0c;MyISAM和InnoDB,今天我们来详细讲解下Mysql的存储引擎 文章目录 Mysql实战-SQL存储引擎1.存储引擎2.MyISAM的特点3. InnoDB的特…

Godot 官方2D C#重构(4):TileMap进阶使用

文章目录 前言完成内容项目节点结构TileMap设置图片资源备选图片添加物理碰撞添加y轴遮罩判断Y Sort Enable是干什么的&#xff1f; 脚本代码 前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 完成内容 项目节点结构 TileMap设置 图片资源 备选图…

Leetcode—21.合并两个有序链表【简单】

2023每日刷题&#xff08;十三&#xff09; Leetcode—21.合并两个有序链表 直接法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* mergeTwoLists(struct ListNode* list1, struct…

Error: no matching distribution found for tensorflow-cpu==2.6.*

目录 install_tensorflow()安装过程中遇到的问题 查找解决方案过程中&#xff1a; 解决办法&#xff1a; install_tensorflow()安装过程中遇到的问题 在服务器上安装tensorflow时&#xff0c;遇到了一个报错信息&#xff1a; 在网上找到一个类似的错误&#xff08;TensorFlow…

Django 全局配置 settings 详解

文章目录 1 概述1.1 Django 目录结构 2 常用配置&#xff1a;settings.py2.1 注册 APP&#xff1a;INSTALLED_APPS2.2 模板路径&#xff1a;TEMPLATES2.3 静态文件&#xff1a;STATICFILES_DIRS2.4 数据库&#xff1a;DATABASES2.5 允许访问的主机&#xff1a;ALLOWED_HOSTS 1 …

大数据-Storm流式框架(五)---DRPC

DRPC 概念 分布式RPC&#xff08;DRPC&#xff09;背后的想法是使用Storm在运行中并行计算真正强大的函数。 Storm拓扑接收函数参数流作为输入&#xff0c;并为每个函数调用发送结果的输出流。 DRPC并不是Storm的一个特征&#xff0c;因为它基于Storm的spouts&#xff0c;bo…

Ansible脚本进阶---playbook

目录 一、playbooks的组成 二、案例 2.1 在webservers主机组中执行一系列任务&#xff0c;包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。 2.2 在名为dbservers的主机组中创建一个用户组&#xff08;mysql&#xff09;和一个用户&#xf…

二进制部署kubernetes集群的推荐方式

软件版本&#xff1a; 软件版本containerdv1.6.5etcdv3.5.0kubernetesv1.24.0 一、系统环境 1.1 环境准备 角色IP服务k8s-master01192.168.10.10etcd、containerd、kube-apiserver、kube-scheduler、kube-controller-manager、kubele、kube-proxyk8s-node01后续etcd、conta…

论坛介绍 | COSCon'23 开源文化(GL)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&a…

【Qt】文件系统

文章目录 文件系统文件操作案例&#xff1a;显示路径到标题框&#xff0c;显示内容到文本框对文件进行写操作获取文件相关信息 文件系统 Qt 通过QIODevice提供了对 I/O 设备的抽象&#xff0c;这些设备具有读写字节块的能力&#xff0c;下面是 I/O 设备的类图&#xff1a; QIO…

缓解大模型幻觉问题的解决方案

本文记录大模型幻觉问题的相关内容。 参考&#xff1a;Mitigating LLM Hallucinations: a multifaceted approach 地址&#xff1a;https://amatriain.net/blog/hallucinations &#xff08;图&#xff1a;解决大模型幻觉的不同方式&#xff09; 什么是幻觉&#xff1f; 幻觉…

掌握CSS Flexbox,打造完美响应式布局,适配各种设备!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 基…

Hover:借贷新势力崛起,在经验与创新中找寻平衡

复苏中的Cosmos 如果让我选择一个最我感到可惜的区块链项目&#xff0c;我会选择Cosmos。 Cosmos最早提出并推动万链互联的概念&#xff0c;希望打通不同链之间的孤岛&#xff0c;彼时和另一个天王项目Polkadot号称跨链双雄。其跨链技术允许不同的区块链网络互相通信&#xf…

M1安装OpenPLC Editor

下载OpenPLC Editor for macOS.zip文件后&#xff0c;使用tar -zvxf命令解压&#xff0c;然后将"OpenPLC Editor"拖入到"应用程序"文件夹 右键点击"OpenPLC Editor"&#xff0c;打开这个""文件&#xff0c;替换为以下内容 #!/bin/bash…

分布式锁其实很简单,6行代码教你实现redis分布式锁

一、前言 分布式锁是一种用于协调分布式系统中多个节点之间对共享资源进行访问控制的机制。它可以确保在分布式环境下&#xff0c;同一时间只有一个节点能够获取到锁&#xff0c;并且其他节点需要等待释放锁后才能获取。 以下是使用分布式锁的几个常见场景和原因&#xff1a;…

「常识」浮点数和定点数

浮点数和定点数 本篇文章旨在简短的介绍浮点数、定点数的定义&#xff0c;以及一些常见的数制、补码。 一、常识 如果缺少以下常识的话&#xff0c;将很难理解浮点数和定点数的概念。 1、数 自然数整数/分数小数&#xff1a;有限小数、无限循环小数、无限不循环小数实数&a…

2.2 消元法的概念

一、消元法介绍 消元法&#xff08;elimination&#xff09;是一个求解线性方程组的系统性方法。下面是使用消元法求解一个 2 2 2\times2 22 线性方程组的例子。消元之前&#xff0c;两个方程都有 x x x 和 y y y&#xff0c;消元后&#xff0c;第一个未知数 x x x 将从第…

APC学习记录

文章目录 APC概念APC插入、执行过程逆向分析插入过程执行过程总结 代码演示参考资料 APC概念 APC全称叫做异步过程调用&#xff0c;英文名是 Asynchronous Procedure Call&#xff0c;在进行系统调用、线程切换、中断、异常时会进行触发执行的一段代码&#xff0c;其中主要分为…

机器学习 | 决策树算法

一、决策树算法概述 1、树模型 决策树&#xff1a;从根节点开始一步步走到叶子节点(决策)。所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归。 在分类问题中&#xff0c;表示基于特征对实例进行分类的过程&#xff0c;可以认为是if-then的集合&#xff0…

推理还是背诵?通过反事实任务探索语言模型的能力和局限性

推理还是背诵&#xff1f;通过反事实任务探索语言模型的能力和局限性 摘要1 引言2 反事实任务2.1 反事实理解检测 3 任务3.1 算术3.2 编程3.3 基本的句法推理3.4 带有一阶逻辑的自然语言推理3.5 空间推理3.6 绘图3.7 音乐3.8 国际象棋 4 结果5 分析5.1 反事实条件的“普遍性”5…