我今天写了一道稀土掘金里面的数组类型的编程题,题目名称为小M的得分挑战。
本题的描述为:
小M有一个长度为 `n` 的数组 `a`,初始分数为 `0`。小M每次可以选择两个整数,并且这两个数的差值不能超过 `k`。
小M会获得这两个数的乘积作为分数,并且已经被选择过的数不能再被选择。你需要帮助小M计算,最多能获得多少分数?
我的想法是先对数组进行由小到大的排序,然后采用双指针法来计算最大分数。
以下是我的具体代码:
public static int solution(int n, int k, int[] a) {
// write code here
Arrays.sort(a);
int sum = 0;
for(int i = n-1;i>0;i--){
int right = a[i];
int left = a[i-1];
if((right-left)<=k){
sum = sum+right*left;
i--;
}
}
System.out.println(sum);
return sum;
}
我首先先用Arrays工具类对数组排序,然后我用两个变量,right和left分别表示每次选中的两个数。其中right比left大。
for循环表示right能取到的所有合理下标,然后在这些下标里面挑选符合条件的right和left值。
挑选的方法是加了if语句,当(right-left)<=k时,这是合理的一对值,应该加入到sum中
因为要找的是最大值,所以比较大的数尽量取到,所以采用的是i从后向前遍历。
遍历完一遍之后,将sum返回给main函数。当然,最后也成功通过了测试。
后续我用AI刷题里的AI机器人让它帮我检查了一下代码,并且让它给出了他的想法。
我的思路是排序,然后加一层for循环,它的思路是不排序,写了两层for循环,外层循环表示right,内层表示left。
然后内层循环的时候找出来满足条件的最大left值,并且将此时的left和right标记为已使用,避免重复。
而我是在循环之前先加了一个排序,这样的话在循环遍历的时候可以避免重复,省去了标记元素这一步骤。
通过这次使用AI刷题,让我意识到了人工智能的出现无疑是一次革命性的变革。
它不仅提供了解题思路,还能根据每个人写的代码给出建议和意见。
通过AI刷题我相信以后我肯定能够取得很大的进步。这简直是每个程序员的良师益友。