前言
实测通义灵码:解锁智能编程的钥匙:https://developer.aliyun.com/article/1367211?spm=a2c6h.13148508.setting.15.5f074f0etrEHdr
探索通义灵码在算法生成中的无限潜力——数组篇:https://developer.aliyun.com/article/1367500?spm=a2c6h.13148508.setting.14.5f074f0etrEHdr
字符串篇
字符串是由零个或多个字符组成的有限序列。一般记为。它是编程语言中表示文本的数据类型。
字符串与数组有很多相似之处,比如使用 名称[下标] 来得到一个字符。然而,字符串有其鲜明的特点,即结构相对简单,但规模可能是庞大的。
以生物中的 DNA 序列为例,假设一个 DNA 序列为,在人体中,该序列的长度可能会达到 n × 10^8
然而,构成序列的基本碱基种类只有4 种。
这里我们可将作一个字符集,由字符集中的一些字符组合而成的 DNA 序列可以看作一个字符串。
在编程语言中,字符串往往由特定字符集内有限的字符组合而成,根据其特点,对字符串的 操作 可以归结为以下几类:
字符串的比较、连接操作(不同编程语言实现方式有所不同);
涉及子串的操作,比如前缀,后缀等;
字符串间的匹配操作,如 KMP 算法、BM 算法等。
反转字符串
给出提问如下:
编写一个函数,其作用是将输入的字符串反转过来。根据以下代码完成:
class Solution:
def reverseString(self, s: List[str]) -> None:
生成代码如下:
给出代码及对照结果, 正确 !
整数反转
给出提问如下:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
根据以下代码完成:class Solution:
def reverse(self, x: int) -> int:
生成代码如下:
给出代码及对照结果, 正确 !
字符串中的第一个唯一字符
给出提问如下:
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1。根据以下代码完成:
class Solution:
def firstUniqChar(self, s: str) -> int:
生成代码如下:
给出代码及对照结果, 正确 !
有效的字母异位词
给出提问如下:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。根据以下代码完成:
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
生成代码如下:
给出代码及对照结果, 正确 !
验证回文串
给出提问如下:
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
根据以下代码完成:class Solution:
def isPalindrome(self, s: str) -> bool:
生成代码如下:
给出代码及对照结果, 正确 !
字符串转换整数 (atoi)
给出提问如下:
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。
根据以下代码完成:class Solution:
def myAtoi(self, s: str) -> int:
生成代码如下:
给出代码及对照结果, 正确 !
实现 strStr()
给出提问如下:
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
根据以下代码完成:class Solution:
def strStr(self, haystack: str, needle: str) -> int:
生成代码如下:
给出代码及对照结果, 正确 !
外观数列
给出提问如下:
给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
你可以将其视作是由递归公式定义的数字字符串序列:
countAndSay(1) = "1"
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:
1
11
21
1211
111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。
根据以下代码完成:class Solution:
def countAndSay(self, n: int) -> str:
对于此类题设较为复杂的题,不出所料,未通过实例测试。
此时开始判断是大模型的哪种错误情况,我提问如下:
此时,它并未意识到自己生成的代码逻辑下当输入n = 4时,输出为" ",所以此处为代码逻辑幻觉。
再次进行测试,给出代码及对照结果, 正确 !
最长公共前缀
给出提问如下:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。根据以下代码完成class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
生成代码如下:
给出代码及对照结果, 正确 !
结论
通义灵码对于基础字符串的处理已经臻至化境了,对于普通的字符串算法题能够准确的理解其含义,并能快速生成符合题意的算法,而且时间、空间复杂度,内存占用都比较可观。
能够从题目描述中提取关键信息,并将其转化为可操作的指令和数据结构,使得生成的算法更加贴合题目要求。
通过模式匹配和知识推理的方法,结合已有的算法模板和优化技巧,生成高效且正确的代码。
能够根据题目给出的限制条件,分析和评估不同算法的时间复杂度和空间复杂度,选择最优的解决方案。同时,通义灵码还能针对具体算法进行进一步的优化,以提高算法的执行效率和内存利用率。
题目 | 最初答案 | 最终答案 | 执行用时 | 内存消耗 |
---|---|---|---|---|
反转字符串 | √ | √ | 超过87.64% | 超过82.28% |
整数反转 | √ | √ | 超过70.72% | 超过99.30% |
字符串中的第一个唯一字符 | √ | √ | 超过5.08% | 超过82.46% |
有效的字母异位词 | √ | √ | 超过72.34% | 超过40.70% |
验证回文串 | √ | √ | 超过63.98% | 超过49.00% |
字符串转换整数 (atoi) | √ | √ | 超过9.12% | 超过55.25% |
实现 strStr() | √ | √ | 超过58.89% | 超过65.17% |
外观数列 | × | √ | 超过42.74% | 超过98.10% |
最长公共前缀 | √ | √ | 超过68.71% | 超过80.78% |
【注意】最初答案指第一次生成的答案是否正确;最终答案指多次调教之后生成的答案是否正确;执行用时越短,超过的比例就越多;内存消耗越少,超过的比例就越多。