书接上文《爱编程 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