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

背景

俗话说,温故而知新。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.rhkb.cn/news/20241.html

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

相关文章

Postman的使用:测试Excel文件导入导出

1.导入的测试方法 选择form-data,key值填写方法对应的参数&#xff0c;选择File&#xff0c;Value处上传文件即可。 2. 导出的测试方法 在导出文件的时候&#xff0c;响应结果是乱码&#xff0c;然后在测试的时候选择下载&#xff0c;下载完成的Excel文件不是乱码

postman 导出导入文件excel 请求方式设置

导出&#xff1a; 正常发送请求&#xff1a; 发送请求设置&#xff1a; 导入&#xff1a; post请求&#xff0c;接口参数 RequestParam("file") MultipartFile file

导入/导出 Postcat 格式文件,打通数据不再难

导入 Postcat 插件。 使用 导入功能有多个入口&#xff0c;你可以在 API 分组处点击加号导入 API&#xff1a; 也可以在点击设置&#xff0c;然后选择导入选项 导出 Postcat 插件 支持导出 Postcat JSON 文件。 使用 进入空间页面&#xff0c;可以看到导出功能&#xff0c;点…

chatgpt赋能python:Python怎么导入CSV文件?

Python怎么导入CSV文件&#xff1f; 导入CSV文件是Python编程中的一项非常常见的任务。CSV文件是一种结构化文件格式&#xff0c;通常用于存储表格形式的数据。Python提供了多种方法来导入CSV文件&#xff0c;如以下三种&#xff1a; 1. 使用csv模块 Python的csv模块是一种简…

postman测试Excel文件导入导出功能

导入Excel核心代码 ApiOperation("导入Excel")PostMapping("/importExcel")public ActionResult importExcel(RequestParam("file") MultipartFile file){if (file.getOriginalFilename().contains(".xlsx")) {ImportParams params n…

chatgpt赋能python:Python中的文件导入方法

Python中的文件导入方法 在Python编程中&#xff0c;需要经常导入外部的文件&#xff0c;以增强程序的功能和可读性。本文将介绍常见的Python中的文件导入方法。 import语句 Python通过import语句来导入其他.py文件中的模块&#xff0c;语法如下&#xff1a; import module…

搭建自己的学术科研专用ChatGPT

前言 最近在github上看到有大佬开源了一个科研工作专用ChatGPT&#xff0c;为此很感兴趣就根据说明自己在本地搭建了一下&#xff0c;此文章用来记录一下。github地址&#xff1a;科研工作专业ChatGPT 科研工作专用ChatGPT拓展&#xff0c;特别优化学术Paper润色体验&#xff…

ChatGPT prompt engineering for developers 笔记

最近好多人在推荐这个课程&#xff0c;学习记录一下~ 原视频 【中文完整版全9集】ChatGPT提示工程师&#xff5c;AI大神吴恩达教你写提示词&#xff5c;prompt engineering_哔哩哔哩_bilibili 完整笔记 prompt-engineering-for-developers/content at main datawhalechina…

latex的Windows安装教程:texlive和texstudio—经验汇总内含详细图文链接

最近因为有文章被外国某同行出版商&#xff08;医学相关&#xff09;看中&#xff0c;邀请把文章内容编成一个小章节&#xff0c;发过来一个tex文件&#xff0c;需要按照他们的要求进行排版&#xff0c;于是本小白开启了两天的卸载和安装过程。 结合大家的安装经验和我自己在安…

electron + vue3 + element-plus + blockly项目记录

目录 项目背景 框架版本 框架的个人理解 项目搭建 electron搭建 blockly&#xff08;大坑&#xff09; 开发 blockly 吐槽 electron loadFile和loadURL BrowserWindow.getAllWindows() 项目背景 笔者之前主要是做后端&#xff0c;前端只了解一点点&#xff0c;用…

C++ MFC 学习笔记+小型通讯录系统实现

MFC 最详细入门教程 [MFC常用函数总结]&#xff08;https://www.cnblogs.com/jiu0821/p/4606639.html&#xff09; [C & MFC]https://www.cnblogs.com/gaohongchen01/p/4176963.html [MFC入门&#xff08;一&#xff09;]https://www.cnblogs.com/yangyuqing/p/10283641…

古月居《ROS入门21讲》零基础学习笔记

文章目录 前言1.课程简介2.Linux系统介绍及安装3.Linux基础操作&#xff08;操作集&#xff09;命令结构常用命令快捷操作 4.cpp&python极简基础&#xff08;操作集&#xff09;简单对比安装编译器编译和运行 5.安装ROS6.ROS是什么7.ROS的核心概念节点与节点管理器节点&…

【对话ChatGPT】如何看待java行业内卷的问题?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;ccLoveStudy 当今大环境&#xff0c;编程行业火热&#xff0c;而java行业更是首当其冲&#xff0c;但是为此&#xff0…

Windows 11的最新人工智能应用Windows Copilot面世!

Windows Copilot是Windows 11预览版中的一项AI辅助功能。 Windows 11还包括设置应用程序的更改&#xff0c;更广泛的支持压缩文件格式。 上个月&#xff0c;微软宣布将继续其将ChatGPT应用于所有产品的冒险之旅&#xff0c;推出了名为Copilot的新Windows 11功能。几个月前&…

State of GPT:大神Andrej揭秘OpenAI大模型原理和训练过程

来自&#xff1a;Web3天空之城 进NLP群—>加入NLP交流群 前言 OpenAI的创始人之一&#xff0c;大神Andrej Karpthy刚在微软Build 2023开发者大会上做了专题演讲&#xff1a;State of GPT&#xff08;GPT的现状&#xff09;。 在这个朴实无华的题目之下&#xff0c;Andrej带来…

OpenAI大神Andrej爆火演讲,官方第一次揭秘大模型原理和训练过程!

来源 | Web3天空之城 作者 | 天空之城城主 OpenAI的创始人之一&#xff0c;大神Andrej Karpthy刚在微软Build 2023开发者大会上做了专题演讲&#xff1a;State of GPT&#xff08;GPT的现状&#xff09;。 在这个朴实无华的题目之下&#xff0c;Andrej带来的是一场超级精彩的分…

Huntly: 一款超强大的自托管信息管理工具,支持管理RSS、自动保存网页、稍后阅读...

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; ​ 今天推荐的这个项目是「Huntly」&#xff0c;一个自托管的信息管理工具。 简单来说&#xff0c;它包含以下功能&#xff1a; RSS 订阅和阅读&#xff1b;自动保存浏览过的网页&a…

带你从零开始入门AI绘画神器Stable Diffusion

一、本地部署 Stable diffusion 1. 前言 目前市面上比较权威&#xff0c;并能用于工作中的 AI 绘画软件其实就两款。一个叫 Midjourney&#xff08;简称 MJ&#xff09;&#xff0c;另一个叫 Stable-Diffusion&#xff08;简称 SD&#xff09;。MJ 需要付费使用&#xff0c;而…

记一次iOS微信恢复聊天记录的尝试

最近手机坏了&#xff0c;为了到天才吧维修手机&#xff0c;为手机做了一个爱思助手的全备份。结果手机修好之后爱思助手无法恢复备份到手机。之前从来没有想到过iOS备份会失效&#xff0c;所以没有对微信聊天记录做单独的备份。尝试了2次无法恢复&#xff0c;确认不是偶然无法…

跨越时空的对话:如何使用AI阅读工具ChatDOC快速建立数字化身?

跨越时空的对话&#xff1a;如何使用 ChatDOC 快速建立数字化身&#xff1f;以史蒂夫乔布斯 AI 为例 开门见山&#xff0c;这篇文章主要介绍如何将 AI 改造为靠谱、好用、基于某个人物的数字化身。比如&#xff0c;乔布斯 AI、马斯克 AI、张一鸣 AI、王兴 AI、佛陀 AI、孔子 A…