Amazon CodeWhisperer让力扣不再用力code!

2024-02-10 10:40

本文主要是介绍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]

image.png
image.png

优化

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

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] = ireturn []

image.png
image.png

结果

image.png
方法二较于方法一,由于减少了循环,虽然内存消耗有所提高,但是执行时间缩减了近百倍,可见用好提示词,也是一个使用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 prefixdef 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]

image.png

结果

image.png

中规中矩

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

两数相加(2)

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

示例 1:
image.png输入: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 = headcarry = 0while l1 or l2 or carry:if l1:carry += l1.vall1 = l1.nextif l2:carry += l2.vall2 = l2.nextcur.next = ListNode(carry % 10)cur = cur.nextcarry //= 10return head.next

image.png

结果

image.png

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

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  6. 返回整数作为最终结果。

注意:

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

示例 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 0if str[0] == '-' or str[0] == '+':sign = 1 if str[0] == '+' else -1str = str[1:]else:sign = 1res = 0for i in str:if i.isdigit():res = res * 10 + int(i)else:breakres = res * signif res < -2**31:return -2**31elif res > 2**31 - 1:return 2**31 - 1else:return res

image.png

结果

image.png

千辛万苦?

经过前面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 + nums2nums.sort()n = len(nums)if n % 2 == 0:return (nums[n//2-1] + nums[n//2])/2else:return nums[n//2]

image.png

结果

image.png

最长有效括号(32)

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

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

题解

class Solution:def longestValidParentheses(self, s: str) -> int:stack = []stack.append(-1)res = 0for 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

image.png

结果

image.png

优缺点

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

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

image.png

总结

通过上述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
image.png
想要用技术实验、产品体验、案例应用等方式,亲身感受最新、最热门的亚马逊云科技开发者工具与服务,来云上探索实验室发现 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

这篇关于Amazon CodeWhisperer让力扣不再用力code!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/696892

相关文章

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品,常闻有言称存在无需考量负债与查询记录之奇品,此等说法十有八九为中介诱人上钩之辞。轻信之下,恐将步入连环陷阱。除非个人资质出类拔萃,如就职于国央企或事业单位,工龄逾年,五险一金完备,还款能力卓越,或能偶遇线下产品对查询记录稍显宽容,然亦非全然无视。宣称全然不顾者,纯属无稽之谈。 银行非慈善机构,不轻易于困境中援手,更偏爱锦上添花之举。若无坚实资质,即便求助于银行亦难获青睐。反

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height

每日一题,力扣leetcode Hot100之238.除自身以外数组的乘积

乍一看这个题很简单,但是不能用除法,并且在O(N)时间复杂度完成或许有点难度。 考虑到不能用除法,如果我们要计算输出结果位置i的值,我们就要获取这个位置左边的乘积和右边的乘积,那么我新设立两个数组L和R。 对于L来说,由于表达的是位置i左边的数的乘积,那么L[0]=1,因为第一个数字左边没数那么为了不影响乘积初始值就设置为1,那么L[1]=L[0]*nums[0],那么L[i]=L[i-1