新的刷题神器-豆包MarsCode!
今天偶然发现一个新的刷题神器豆包MarsCode
,它是字节旗下基于豆包大模型打造的智能开发工具,它提供了强大的AI能力,通过代码不全、代码推荐、单测生成等各项能力能够在编程的各个阶段给程序员们提供帮助。除了上述提到的功能之外,豆包MarsCode
还有一项非常强大的功能------代码练习!
简介
首先进入豆包MarsCode官网
点击上方的代码练习
就能进入刷题页面,这跟传统的刷题不同,是有AI陪练的刷题神器!
自定义添加题目
除了常规的刷题之外,还可以自定义添加题目!
我们来体验一下自己输入题目,然后进行刷题,假如我们有这么一个机器人最大距离的题目
机器人路径的最大距离
在一个无限大小的 XY 网格平面上,有一个机器人从点 (0, 0)
处开始出发,面向北方。机器人可以接收以下三种类型的命令 commands
:
-2
:向左转90
度-1
:向右转90
度1 <= x <= 9
:向前移动x
个单位长度
在网格上有一些格子被视为障碍物 obstacles
。第 i
个障碍物位于网格点 obstacles[i]
= ( x i x_i xi, y i y_i yi)。
机器人无法走到障碍物上,它将会停留在障碍物的前一个网格方块上,但仍然可以继续尝试进行该路线的其余部分。
请编写一个 Java 程序,计算机器人从原点出发后,经过所有命令后到达的最终位置,并返回该位置与原点之间的欧式距离的平方。
示例:
输入: commands = [4, -1, 4, -2, 4], obstacles = [[2, 4]]
输出: 65
解释: 机器人最终位置为 (1, 8),距离原点的欧式距离的平方为 1 2 1^2 12+ 8 2 8^2 82 = 1 + 64 = 65。
注意:
- 北表示
+Y
方向。 - 东表示
+X
方向。 - 南表示
-Y
方向。 - 西表示
-X
方向。
首先点击添加题目
图标,进入添加题目页面,支持多种常用开发语言(Python、JavaScript、Java、C++等)这里以Java为例,并且编辑器支持Markdown
格式,将我们的题目复制到编辑器中,点击 开始答题
这里可以看到已经有我们刚刚添加的题目了
假设我们现在没有思路,我们可以求助AI助手
,点击需要一点思路提示,就会根据题目自动生成思路
对于这道题,我们首先要理解问题的核心是根据给定的命令让机器人在网格中移动,并避开障碍物,最终计算机器人与原点的欧式距离的平方。
在数据结构选择方面,我们可以使用一个二维数组或者坐标类来表示机器人的位置和障碍物的位置。
算法步骤大致如下:
初始化机器人的位置为
(0, 0)
,方向为向北。遍历命令数组。
- 如果是
-2
,则向左转 90 度,更新方向。- 如果是
-1
,则向右转 90 度,更新方向。- 如果是
1 <= x <= 9
,则根据当前方向向前移动x
个单位长度,但在移动过程中要检查是否会碰到障碍物,如果碰到则停止在障碍物前。计算最终位置与原点的欧式距离的平方。
希望这些思路能对你有所帮助,加油!
可以看到AI助手回答的思路非常正确,是完美符合我们题目要求的,但是假如现在还是不会😭!我们再求助一下AI助手,让它生成代码帮助我们!
生成的全部代码提示如下所示,可以看到豆包帮我们生成了大部分的代码,将题目的主要代码都生成出来,但是还有一些逻辑没有填写。
java
public class Main {
// 定义方向常量
private static final int NORTH = 0;
private static final int EAST = 1;
private static final int SOUTH = 2;
private static final int WEST = 3;
public static int solution(int[] commands, int[][] obstacles) {
// 初始化机器人位置为 (0, 0)
int x = 0;
int y = 0;
// 初始方向为向北
int direction = NORTH;
for (int command : commands) {
// 如果是 -2,向左转 90 度
if (command == -2) {
direction = (direction + 3) % 4; // 注释:通过取余实现方向的轮转
}
// 如果是 -1,向右转 90 度
else if (command == -1) {
direction = (direction + 1) % 4; // 注释:通过取余实现方向的轮转
}
// 如果是移动命令
else if (command >= 1 && command <= 9) {
// 根据方向移动
if (direction == NORTH) {
// 检查是否会碰到障碍物,碰到则停止
if (checkObstacle(x, y + command, obstacles)) {
y = getStopPosition(x, y + 1, obstacles);
break;
} else {
y += command;
}
} else if (direction == EAST) {
// 类似的检查和移动逻辑
} else if (direction == SOUTH) {
// 类似的检查和移动逻辑
} else if (direction == WEST) {
// 类似的检查和移动逻辑
}
}
}
// 计算与原点的欧式距离的平方并返回
return x * x + y * y;
}
// 检查指定位置是否有障碍物
private static boolean checkObstacle(int x, int y, int[][] obstacles) {
// 实现检查逻辑
return false;
}
// 获取碰到障碍物时的停止位置
private static int getStopPosition(int x, int y, int[][] obstacles) {
// 实现获取停止位置的逻辑
return 0;
}
public static void main(String[] args) {
int[] commands = {4, -1, 4, -2, 4};
int[][] obstacles = {{2, 4}};
System.out.println(solution(commands, obstacles));
}
}
我们将代码补全一下,将其他的逻辑补充完整,并对代码进行一些微调
java
public class Main {
// 定义方向常量
private static final int NORTH = 0;
private static final int EAST = 1;
private static final int SOUTH = 2;
private static final int WEST = 3;
// 定义方向变化数组
private static final int[] dx = {0, 1, 0, -1};
private static final int[] dy = {1, 0, -1, 0};
public static int solution(int[] commands, int[][] obstacles) {
// 初始化机器人位置为 (0, 0)
int x = 0;
int y = 0;
// 初始方向为向北
int direction = NORTH;
for (int command : commands) {
// 如果是 -2,向左转 90 度
if (command == -2) {
direction = (direction + 3) % 4; // 注释:通过取余实现方向的轮转
}
// 如果是 -1,向右转 90 度
else if (command == -1) {
direction = (direction + 1) % 4; // 注释:通过取余实现方向的轮转
}
// 如果是移动命令
else if (command >= 1 && command <= 9) {
// 根据方向移动
if (direction == NORTH) {
// 检查是否会碰到障碍物,碰到则停止
if (checkObstacle(x, y ,direction,command, obstacles)) {
y = getStopPosition(x, y ,direction,command, obstacles);
} else {
y += command;
}
} else if (direction == EAST) {
// 类似的检查和移动逻辑
if (checkObstacle(x, y ,direction,command, obstacles)) {
x = getStopPosition(x, y ,direction,command, obstacles);
} else {
x += command;
}
} else if (direction == SOUTH) {
// 类似的检查和移动逻辑
if (checkObstacle(x, y ,direction,command, obstacles)) {
y = getStopPosition(x, y ,direction,command, obstacles);
} else {
y -= command;
}
} else if (direction == WEST) {
// 类似的检查和移动逻辑
if (checkObstacle(x, y ,direction,command, obstacles)) {
x = getStopPosition(x, y ,direction,command, obstacles);
} else {
x -= command;
}
}
}
}
// 计算与原点的欧式距离的平方并返回
return x * x + y * y;
}
// 检查指定位置是否有障碍物
private static boolean checkObstacle(int x, int y, int direction,int command ,int[][] obstacles) {
// 实现检查逻辑
for (int i = 1; i <= command; i++) {
int newX = x + dx[direction] * i;
int newY = y + dy[direction] * i;
for (int[] obstacle : obstacles) {
if (obstacle[0] == newX && obstacle[1] == newY) {
return true;
}
}
}
return false;
}
// 获取碰到障碍物时的停止位置
private static int getStopPosition(int x, int y,int direction,int command , int[][] obstacles) {
// 实现获取停止位置的逻辑
for (int i = 1; i <= command; i++) {
int newX = x + dx[direction] * i;
int newY = y + dy[direction] * i;
for (int[] obstacle : obstacles) {
if (obstacle[0] == newX && obstacle[1] == newY) {
if(direction == NORTH || direction == SOUTH){
return newY-1;
}
return newX-1;
}
}
}
return 0;
}
public static void main(String[] args) {
int[] commands = {4, -1, 4, -2, 4};
int[][] obstacles = {{2, 4}};
System.out.println(solution(commands, obstacles));
}
}
我们将代码复制到代码框中,点击运行看看回答的对不对!
我们先根据示例模拟一遍流程,找出正确答案
- 机器人从
(0, 0)
开始,面向北方。- 第一个命令是
4
,机器人向前移动 4 个单位,到达(0, 4)
。- 第二个命令是
-1
,机器人向右转 90 度,面向东方。- 第三个命令是
4
,机器人向前移动 4 个单位,但遇到障碍物(2, 4)
,所以机器人停在(2, 4)
的前一个位置(1, 4)
。- 第四个命令是
-2
,机器人向左转 90 度,面向北方。- 第五个命令是
4
,机器人向前移动 4 个单位,到达(1, 8)
。最终位置是
(1, 8)
,距离原点的欧式距离的平方为1^2 + 8^2 = 1 + 64 = 65
。因此,正确的输出应该是
65
。
然后运行
可以看到输出了正确答案,我们还可以让AI帮我们优化代码
使用感受
- 自定义题目功能:
- 具备非常高的灵活性,支持自定义题目,可以自己根据个人需求创建不同类型、不同难度的算法题目,满足个性化学习的要求
- 适用范围广,可以让初学者或者资深开发人员都可以通过自定义题目来提升自己,甚至解决实际的问题
- AI辅助功能
- 支持思路提示,如果没有思路可以求助AI帮助,AI生成思路较为详细并且准确率高,可以帮助用户梳理解题思路
- 支持代码提示,如果思路有了,但是代码实现有困难,可以生成代码主体框架,并且还带有注释(非常人性化)
- 允许用户在AI助手页面提问题,可以让AI帮忙优化代码,也可以询问题目中具体逻辑有没有更好的实现方式,可以帮助用户开拓思路,从不同角度考虑解题方法
- 使用体验
- 平台界面友好,操作简单
- 功能强大,具备AI陪练功能,涵盖从思路生成到代码实现甚至代码优化的全过程,能够帮助学习
- 改进意见:
- 在生成思路的时候正确理解了题目要求,但是在生成代码实现时代码只考虑到了终点是否存在障碍物
- 界面可以提供多种颜色搭配
总的来说豆包MarsCode是一款功能强大的刷题神器,应该是字节旗下的又一个爆款!
👍 👍 👍 👍 👍 👍
🉑 🉑 🉑 🉑 🉑 🉑