由浅入深之字符串的算法题(vs: chatGPT做算法)

news/2024/4/24 0:19:09/文章来源:https://blog.csdn.net/u010420283/article/details/129678137

背景

俗话说,温故而知新。chatGPT效果太惊艳了!简直就是碾压的效果。但是还要有希望,先拾取,再创新。先了解,再超越吧。

ps: 再刷最后一遍算法题思路。顺便基于chatGPT3.5感受一下大模型的魔力。

字符串基础

C/C++每个字符串都以‘\0’作为结尾,这样就能很方便的找到字符串的最后尾部。由于这个特点,每个字符串都有一个额外字符的开销,稍不留神还会造成字符串的越界。如下,要想正确把0123456789复制到数组str中,需要声明一个长度为11字节的数组。

char str[10];
strcpy(str,"0123456789");

字符串数组与字符串指针

为节省内存,C/C++把常量字符串放在单独的一个内存区域。当几个指针赋值给相同的常量字符串时,他们实际会指向相同的内存地址。但是用常量内存初始化数组,情况却有所不同。

运行如下代码,会得到的结果是?

int main()
{char str1[]="hello world";char str2[]="hello world";char* str3="hello world";char* str4="hello world";if(str1==str2)printf("str1 and str2 are same.\n");elseprintf("str1 and str2 are not same.\n");if(str3==str4)printf("str3 and str4 are same.\n");elseprintf("str3 and str4 are not same.\n");return 0;    
}

str1和str2是两个字符串数组,我们会为它们分配两个长度为12字节的空间,并把“hello world”的内容分别复制到数组中去。这是两个初始地址不同的数组,因此str1和str2的值不相同。

str3和str4是两个指针,我们无须为它们分配内存以存储字符串的内容,而只需把它们指向“hello world”在内存中的地址就可以了。由于“hello world”是常量字符串,它在内存中只有一个拷贝,因此str3和str4的值相同。

算法题:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy."。

思路:看到这个题目,我们首先应该想到原来一个空格字符,替换后变成了'%', '2', '0'这3个字符,因此字符串会变长。如果在原来的字符串上进行替换,则有可能覆盖修改在该字符串后面的内存。如果是创建新的字符串,并在新的字符串上进行替换,那么我们可以自己分配足够多的内存。所以,要先明确出题者的需求。假如要在原字符串上进行替换,并保证输入的字符串后面有足够多的空余内存。

时间复杂度为O(n^2)的解法

最直观的做法是从头到尾扫描字符串,每次碰到空格字符的时候进行替换。由于把1个字符替换成3个字符,我们必须把后面所有字符都后移2字节,否则就会有2个字符被覆盖了。假设字符串的长度是n。对每个空格字符,需要移动后面O(n)个字符,因此对于含有O(n)个空格字符串而言,总的时间效率是O(n^2)。

时间复杂度为O(n)的解法

可以先遍历一次字符串,统计出字符串中空格的总数。然后从字符串的后面开始复制和替换。准备两个指针:p1和P2。P1指向原字符串的末尾,而P2指向替换之后的字符串的末尾。

接下来向前移动指针P1, 逐个把它指向字符复制到P2指向的位置,直到碰到第一个空格为止。碰到第一个空格之后,把p1向前移动一格,在P2之前插入字符串“%20”。由于“%20”的长度是3,同时把P2向前移动3格。如此P1接着向前复制,直到碰到第二个空格。当P1和P2指向同一个位置,表明所有空格都已经替换完毕。

这种算法所有的字符都只复制(移动)一次,因此这个算法的时间复杂度是O(n)。

/*length 为字符数组str的总容量,大于或等于字符串str的实际长度*/
void ReplaceBlank(char str[], int length)
{if(str == nullptr && length <= 0)return;/*originalLength 为字符串str的实际长度*/int originalLength = 0;int numberOfBlank = 0;int i = 0;while(str[i] != '\0'){++ originalLength;if(str[i] == ' ')++ numberOfBlank;++ i;}/*newLength 为把空格替换成'%20'之后的长度*/int newLength = originalLength + numberOfBlank * 2;if(newLength > length)return;int indexOfOriginal = originalLength;int indexOfNew = newLength;while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal){if(str[indexOfOriginal] == ' '){str[indexOfNew --] = '0';str[indexOfNew --] = '2';str[indexOfNew --] = '%';}else{str[indexOfNew --] = str[indexOfOriginal];}-- indexOfOriginal;}
}

相关题目: 两个排序数组在其中一个上面完成有序合并

描述: 两个排序的数组A1和A2,内存在A1的末尾有足够多空余空间容纳A2。请实现一个函数,把A2的所有数字插入到A1中,并且所有的数字都是排序的。

解答思路:

如果考虑A1,A2的从前往后进行比较插入,那么就会出现多次复制数字的情况,更好的办法就是从尾到头比较A1, A2中的数字,并把较大的数字复制到A1中合适的位置。从而减少移动的次数,提升效率。

彩蛋:chatGPT做算法

同样的题目,抛给chatGPT3.5,它首先给出了一个最容易实现的思路,然后在两轮人工提醒下,不断优化,得到了我们上面所述的最优解。

点评一下chatGPT的回答:

前两轮chatGPT的回答都是正确的。但是第三轮的解答是错误的

比如,当发现arr1[i]大于arr2[j]时候,它为了减少arr1往后的移动次数,刻意不让arr1[i+1:]中元素都向右移动,而是要从arr1[i+1:]找到一个小于等于arr2[j]的数,这里因为arr1是有序数组,后面的数不可能比前面的数小,明显chatGPT的逻辑发生了混乱。

其实第三轮优化由于我的网络不太稳定,让chatGPT重新生成了3次回答,上面展示的是第3次生成的比较完整的回复,但是我录下了它前面2次回答的过程,虽然没写全,但是思路就是我们上面提到的双指针,从后往前对两个数组进行比较插入的方法。可能多次让它重新生成答案,误导了它,它以为这个回答思路不好吧。

前2次都因为网络问题只产生了一半答案就断了。如下:

第1次生成回答

第2次生成回答:

看到这里,大家是什么感受?

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

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

相关文章

编程题]组队竞赛(Java实现)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

十七、队列

文章目录1、基本概念&#xff08;队列实际上就是一个结构体&#xff0c;可以理解为就是一个数组&#xff09;2、使用场景&#xff1a;任务间或任务与中断间传递数据3、使用队列的好处&#xff08;1&#xff09;休眠唤醒&#xff08;2&#xff09;提高CPU利用率4、队列的核心5、…

WebService简单入门

1. JAX-WS发布WebService 创建web工程 创建simple包&#xff0c;和server、client两个子包。正常情况下server和client应该是两个项目&#xff0c;这里我们只是演示效果&#xff0c;所以简化写到一个项目中&#xff1a; 1.1 创建服务类Server package simple.server;import ja…

JavaScript正则表达式知识拓展总结

JavaScript的正则表达式是前端中比较重要的部分&#xff0c;正则表达式主要用于字符串处理&#xff0c;表单验证等场合&#xff0c;实用高效。JavaScript中的正则表达式比起C#中的正则表达式要弱很多&#xff0c;但基本够用了。在js中定义正则表达式很简单&#xff0c;有两种方…

搭建SFTP服务安全共享文件,实现在外远程访问「内网穿透」

文章目录1.前言2.本地SFTP服务器搭建2.1.SFTP软件的下载和安装2.2.配置SFTP站点2.3.Cpolar下载和安装3.SFTP服务器的发布3.1.Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言 现在的网络发达&#xff0c;个人电脑容量快速上升&#xff0c;想要保存的数据资料也越…

DRBG_InstantiateSeeded调试-1

public 参数解析: standardEKPolicy: 837197674484b3f81a90cc8d46a5d724fd52d76e06520b64f2a1da1b331469aa(32bytes) rawCmdBuf 命令数据: 800200000063000001314000000100000009400000090000010000000400000000003a0001000b000300720020837197674484b3f81a90cc8d46a5d724fd5…

Baumer工业相机堡盟相机如何使用PixelTransformation像素转换功能(像素转换功能的使用和优点以及行业应用)(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

银河麒麟v10系统硬盘挂载并配置yum软件源

一、查看磁盘 近期由于centos系统停止更新用户服务器要更换银河麒麟v10&#xff0c;拿到服务器后使用lsblk -f或fdisk -l命令查看磁盘名称 可以看到sdb200G就是要挂载的硬盘&#xff0c;还没有uuid需要初始化才可以挂载。 二、分区 分区命令&#xff1a; fdisk /dev/【你的…

QML- QML视觉元素类型

QML视觉元素类型一、概述一、图像类型三、共享视觉属性1. 不透明度和可见性2. 转换&#xff08;转置&#xff09;一、概述 对于最基本的视觉效果&#xff0c;Qt Quick提供了一个 Rectangle 类型来绘制矩形。这些矩形可以用颜色或垂直渐变来着色。 Rectangle 还可以在矩形上绘制…

QuestDb 基础使用

一、安装 Download QuestDB | QuestDB 可去官网直接下载对应版本&#xff0c;我这里是Windows版本 二、运行 找到Bin目录运行 管理员Cmd&#xff0c;输入 questDb.exe,即可运行&#xff0c;默认webConsole端口 9000&#xff0c;可在bin下 server.config去修改。 效果如下 …

Mac安装Nacos

参考链接&#xff1a; https://nacos.io/zh-cn/docs/quick-start.html 文章目录Nacos安装下载和解压启动和关闭Nacos什么是nacos?Nacos架构基本架构及概念逻辑架构及其组件介绍领域模型数据模型服务领域模型配置领域模型类视图Nacos安装 下载和解压 从链接中下载最新的版本 …

Vue基础25之路由第四节

Vue基础25路由编程式路由导航Home.vue(去掉两个router-line的replace)HomeMessage.vueBanner.vue总结缓存路由组件Home.vueHomeNews.vueHomeMessage.vue总结两个新的生命周期钩子HomeNews.vueHomeMessage.vueHome.vue总结全局路由守卫路由前置守卫src/router/index.js路由后置守…

Qt QShortCut快捷键原理、实现和应用

应用 QShortCut方式的快捷键有好几种使用方式&#xff1a; 1.通过绑定QAction或QMenu的方式。QAction和QMenu都提供了setShortcut()接口&#xff1b; 2.实例化一个对象&#xff1a;然后绑定信号槽activated()信号&#xff1a; auto shortcut new QShortcut(QKeySequence(tr(…

Postgresql源码(102)子事务控制语句分析

1 子事务控制语句分析 1.1 执行savepoint 执行函数&#xff1a; 【立即执行】→DefineSavepoint→PushTransaction&#xff08;从utility框架进入&#xff09;【延迟执行】→StartSubTransaction&#xff08;从顶层事务框架CommitTransactionCommand进入&#xff09; 准入条…

差分毫伏输出传感器信号隔离转换模块放大器0-10mV/0-20mV/0-±10mV/0-±20mV

概述&#xff1a;DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入…

代码随想录-57-106. 从中序与后序遍历序列构造二叉树

目录前言题目1.递归&#xff08;区间&#xff0c;左闭右开&#xff09;变量2. 本题思路分析&#xff1a;3. 算法实现4. 算法复杂度5. 算法坑点前言 在本科毕设结束后&#xff0c;我开始刷卡哥的“代码随想录”&#xff0c;每天一节。自己的总结笔记均会放在“算法刷题-代码随想…

Java注解怎么用

什么是注解 Java的注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它可以提供程序的额外信息&#xff0c;帮助程序员更好地管理程序。注解通常被用作代码的标记或者指定某些行为的方式。在Java中&#xff0c;注解以符号开头&#xff0c;放在代码的各个位置&a…

【数据结构】千字深入浅出讲解队列(附原码 | 超详解)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;C语言实现数据结构 &#x1f4ac;总结&#xff1a;希望你看完…

linux驱动学习加强版-2(文件驱动的书写)

文章目录一、驱动的外设二、驱动操作文件原理三、编写一个驱动程序3.1 编写驱动程序的步骤3.1.2 确定主设备号以及注册驱动3.1.3 实现对应的函数四、一些错误现象一、驱动的外设 我们的设备硬件都需要驱动才能工作&#xff0c;没有驱动的硬件可以称之为废铁&#xff0c;没有硬…

spacesniffer文件大小查看工具安装和使用

软件描述 spacesniffer是一块可以快速查看电脑中所有文件大小的工具&#xff0c;当电脑空间不够时&#xff0c;可以迅速找出不需要的大提及文件。 一、软件下载 1、从网盘下载 spacesniffer文件大小查看工具 2、从官网下载 http://www.uderzo.it/main_products/space_sni…