当前位置:AIGC资讯 > AIGC > 正文

Amazon CodeWhisperer让力扣不再用力code!

书接上文《爱编程 why not AI编程》,通过前文的对于Amazon CodeWhisperer的介绍、入门指南、相关课程以及【云上探索实验室】活动,各位读者们应该对于Amazon CodeWhisperer有了一些了解,那么作者今天将该通过本篇文章来介绍用Amazon CodeWhisperer去解力扣(LeetCode)的题目。
总所周知,力扣(LeetCode,下面直接称呼为力扣)是万千程序员的编码训练场,提供了大量不同题型、不同难度的题目,想必同学们在学习的过程中,从简单到难的题目都有做过,并且较多的应该是算法题,有些题做起来让人总是有些“秃然”,那么下面的操作都是算法题,咱们看看Amazon CodeWhipserer的表现如何

由奢入俭难

同理,做题也是,从简单入手,饭要一口口吃,路要一步步走,题要从简到难刷,那么下面的案例,作者分别在力扣上找到简单、中等及困难三个等级的题目,让Amazon CodeWhisperer来解题看看,这位“AI编码助手”到底是什么功力的程序员

易如反掌

两数之和(1)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 **和为目标值 **target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]

题解

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if nums[i]+nums[j]==target:
                    return [i,j]


优化

有意思的来啦,作者在需求下面加了一句话 “给出时间和空间最优解”,那么程序也随之进行了优化

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for i, num in enumerate(nums):
            if num in dic:
                return [dic[num], i]
            dic[target - num] = i
        return []


结果


方法二较于方法一,由于减少了循环,虽然内存消耗有所提高,但是执行时间缩减了近百倍,可见用好提示词,也是一个使用CodeWhisperer的好法子。但是,要说的一点,像这样的提示词不一定每次都奏效。

最长公共前缀(14)

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入:strs = [“flower”,“flow”,“flight”] 输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”] 输出:“” 解释:输入不存在公共前缀。

提示:

1 <= strs.length <= 200 0 <= strs[i].length <= 200 strs[i] 仅由小写英文字母组成

题解

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""
        prefix = strs[0]
        for i in range(1, len(strs)):
            while strs[i].find(prefix) != 0:
                prefix = prefix[0:len(prefix)-1]
                if not prefix:
                    return ""
        return prefix
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""
        for i in range(len(strs[0])):
            for j in range(1,len(strs)):
                if i >= len(strs[j]) or strs[j][i] != strs[0][i]:
                    return strs[0][:i]
        return strs[0]

结果

中规中矩

通过上面两道简单的算法题,Amazon CodeWhisperer解答起来可算是易如反掌,那么接下来提升难度,开始解答中等难度的题目,看看Amazon CodeWhisperer表现如何

两数相加(2)

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100] 内 0 <= Node.val <= 9 题目数据保证列表表示的数字不含前导零

题解

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        head = ListNode(0)
        cur = head
        carry = 0
        while l1 or l2 or carry:
            if l1:
                carry += l1.val
                l1 = l1.next
            if l2:
                carry += l2.val
                l2 = l2.next
            cur.next = ListNode(carry % 10)
            cur = cur.next
            carry //= 10
        return head.next

结果

字符串转换整数(atoi)(8)

请你来实现一个 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 。 返回整数作为最终结果。

注意:

本题中的空白字符只包括空格字符 ’ ’ 。 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 1:
输入:s = “42” 输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。

第 1 步:“42”(当前没有读入字符,因为没有前导空格) 第 2 步:“42”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’) 第 3 步:“42”(读入 “42”) 解析得到整数 42 。 由于 “42” 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例 2:
输入:s = " -42" 输出:-42
解释:

第 1 步:" -42"(读入前导空格,但忽视掉) 第 2 步:" -42"(读入 ‘-’ 字符,所以结果应该是负数) 第 3 步:" -42"(读入 “42”) 解析得到整数 -42 。 由于 “-42” 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例 3:
输入:s = “4193 with words” 输出:4193
解释:

第 1 步:“4193 with words”(当前没有读入字符,因为没有前导空格) 第 2 步:“4193 with words”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’) 第 3 步:“4193 with words”(读入 “4193”;由于下一个字符不是一个数字,所以读入停止) 解析得到整数 4193 。 由于 “4193” 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

提示:

0 <= s.length <= 200 s 由英文字母(大写和小写)、数字(0-9)、’ ‘、’+‘、’-’ 和 ‘.’ 组成

题解

class Solution:
    def myAtoi(self, str: str) -> int:
        str = str.strip()
        if not str:
            return 0
        if str[0] == '-' or str[0] == '+':
            sign = 1 if str[0] == '+' else -1
            str = str[1:]
        else:
            sign = 1
        res = 0
        for i in str:
            if i.isdigit():
                res = res * 10 + int(i)
            else:
                break
        res = res * sign
        if res < -2**31:
            return -2**31
        elif res > 2**31 - 1:
            return 2**31 - 1
        else:
            return res

结果

千辛万苦?

经过前面4个题的体验,历经简单到中等难度,到这一阶段直接上强度,力扣将其划分为“困难”级别的题目,这里仅仅准备了两道题作为“困难“级别的演示,具体的可以到视频中看,那么下面大家看看Amazon CodeWhisperer能否轻松应对该试题吧!

寻找两个正序数组的中位数(4)

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:

nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -106 <= nums1[i], nums2[i] <= 106

题解

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        nums = nums1 + nums2
        nums.sort()
        n = len(nums)
        if n % 2 == 0:
            return (nums[n//2-1] + nums[n//2])/2
        else:
            return nums[n//2]

结果

最长有效括号(32)

困难
相关标签
相关企业
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:
输入:s = “(()” 输出:2 解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())” 输出:4 解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “” 输出:0

题解

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        stack = []
        stack.append(-1)
        res = 0
        for i in range(len(s)):
            if s[i] == '(':
                stack.append(i)
            else:
                stack.pop()
                if len(stack) == 0:
                    stack.append(i)
                else:
                    res = max(res, i - stack[-1])
        return res

结果

优缺点

通过本次5道题的一个简单测试,其中有包含2题简单、2题中等以及1题困难,咱们可以基于上面的实验结果可以看到的是–Amazon CodeWhisperer可以轻松应对,其中可以通过增加额外提示词来优化给出的解决方案,例如,"给出最优解"等,让Amazon CodeWhisperer尝试去用不同的解题方法生成代码,以达到基于之前代码的时间和空间的最优解。

虽然Amazon CodeWhisperer的表现不错,但是,也有Amazon CodeWhisperer无法应对的题目,例如,力扣10题其实也是在本篇文章测试范围内,但是按照本篇文章的测试方法让Amazon CodeWhisperer给出解题代码,但没有成功,也许有”中文“的问题的影响

总结

通过上述6个力扣题目测试,可以看到Amazon CodeWhisperer在处理算法题目方面,从易到难都可以轻松应对,但也不是完全全能型的,例如在某些力扣的困难题目操作中,以python3为例,无法成功的根据题目生成代码,甚至于出现在函数中出现"pass"的情况。
总的来说,Amazon CodeWhisperer在代码理解和生成方面在不错的表现,并且可根据用户的要求,尽可能的对代码进行优化,有时还会根据提示词的不同,给出一些代码建议以及解题思路。对于无法解答的题目,也是很直白的给出"Pass"这样的直白回答,也是一个非常诚实的程序员。的确有一些问题无法解决,但是作为一个推出时间不太长的服务,其本身还有很长的过程需要走,就现目前而言,仅仅提供了个人免费版、专业版,那么后续官方肯定会推出企业版,同时Amazon CodeWhisperer也会不断的更新优化,不断完善其功能,发展为“六边形战士”!

最后,根据亚马逊云科技官方消息,“2023年10月9日,储瑞松将接替张文翊,担任亚马逊全球副总裁、亚马逊云科技大中华区执行董事”,从作者本人的角度而言,结合储总在AI方面的经历,亚马逊云科技推出生成式AI新服务—Amazon Bedrock,以及亚马逊云科技推出的全托管式产品向Anthropic注资至多40亿美元,这一系列的动作,可以看出亚马逊云科技在AI方面发展的强劲势头!让我们期待亚马逊云科技能够推出更多更好的人工智能产品!

亚马逊云科技宣布大中华区新任领导人
亚马逊云科技全托管生成式 AI 服务 Amazon Bedrock 现已正式可用
重磅丨亚马逊宣布与 Anthropic 展开战略合作,共同推进生成式 AI 发展

福利时间到

现目前Amazon CodeWhisperer同样还有【云上实验室】活动,广大程序员同学可以参加到活动中,大家在使用Amazon CodeWhisperer的同时,还可以向活动方提出自己宝贵的反馈、建议等,同时还可以获取丰厚的奖品!
不仅如此,咱们还有Innovate大会,拥抱生成式 AI,花样玩法待解锁。想获得最新AI资讯,亚马逊云科技生成式 AI构建者大会将于10月24日在北京举行,届时大咖云集,将为大家带来最新前沿技术和成功案例,现场还有动手实践以及专为Builders 进阶的开源工具体验,报名入口看这里:http://c.suo.nz/daeuR

想要用技术实验、产品体验、案例应用等方式,亲身感受最新、最热门的亚马逊云科技开发者工具与服务,来云上探索实验室发现 Amazon CodeWhisperer 的更多可能:http://c.suo.nz/aadBL
想要快速上手 Amazon CodeWhisperer,官方免费课程《Amazon CodeWhisperer 入门》带你30分钟上车,牵手 AI 编程伴侣,开启云职场新工作方式。
三个平台随意挑,轻松开启学习之旅:
Skill Builder:
http://c.suo.nz/7Rfjz
网易云课堂:
http://c.suo.nz/7RfjJ
CSDN:
http://c.suo.nz/crAyg

更新时间 2023-11-09