本次我将以《小U和字符'R'的喜好》这道题为例,通过这篇文章来解析豆包MarsCode AI刷题的亮点所在;
题面如下:
下面让我们先来独立思考一下这道题要怎么做:
1、字符串中只有两种字符'R'和'B',字典序'R' > 'B',那么在只考虑字典序的情况下,我们很容易将这两个字符类比到数字1和0,符合字典序1 > 0的前提;
2、那么《需要考虑所有仅由字符'R'和'B'组成的字符串》 就等价于 《考虑所有仅由数字1和0组成的数字》 等价于 《所有二进制串》 等价于 《所有数字》;
3、题目要求 所有字符串字典序不小于给定字符串s 等价于 所有二进制数字大于等于给定二进制数num并且数位长度不超过n 等价于 num<=符合要求的数字<=111...1(n个1);
4、最终需要得出的是字符串权值之和 => 所有二进制数中1的个数之和;
那么这道题的实现思路就很明确了:
1、先求出给定字符串s对应的二进制数num;
2、所有大于等于num并且二进制长度不超过n的数的权值之和等价于f(MAXNUM) - f(num),其中MAXNUM=111...1(n个1),f(x)为所有在[1,x]区间内的数的权值之和;
那么本题的重点就在于实现一个快速统计[1,x]范围内所有数二进制表达中1的个数之和的函数f,这时候如果我们没有想到合适的方法😢,就可以求助豆包MarsCode AI了:
可以看到豆包MarsCode AI很快就给出了一个使用动态规划算法实现的方法,不仅有算法实现流程,还给出了算法的伪代码和代码实现😮;
那么我们把这个方法放到总体实现中,并完成实现的其他部分:
#include <bits/stdc++.h>
using namespace std;
int countBits(int n) {
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; ++i) {
dp[i] = dp[i >> 1] + (i & 1);
}
int sum = 0;
for (int i = 1; i <= n; ++i) {
sum += dp[i];
}
// cout<<n<<" "<<sum<<endl;
return sum;
}
int solution(int n, string s) {
// write code here
int num=0;
for(int i=0;i<n;i++){
num *= 2;
if(s[i] == 'R'){
num += 1;
}
}
return countBits((1<<n) - 1) - countBits(num-1);
}
int main() {
cout << (solution(3, "RBR") == 7) << endl;
cout << (solution(4, "RRBB") == 12) << endl;
cout << (solution(2, "BB") == 4) << endl;
return 0;
}
尝试运行一下示例,结果正确:
那么我们现在想提交我们的实现,但是这时候发现目前豆包MarsCode AI刷题平台并不支持c++提交,只支持java和python提交,那怎么办呢?这时候就可以求助豆包MarsCode AI了,让它把我们的c++实现转换为等价的java实现:
在页面右上角选择切换语言到java:
提交答案:
我们就成功通过了本题🤩
本次我们通过《小U和字符'R'的喜好》这道题目的解决过程展示了豆包MarsCode AI刷题平台的几个显著亮点:
- 算法推荐与指导:当用户在解决问题时遇到瓶颈,例如不知道如何有效统计特定范围内的二进制数中1的个数之和时,AI能够提供具体的算法建议,并给出详细的算法流程、伪代码及实现代码,极大地降低了学习和解决问题的门槛。
- 多语言支持与代码转换:虽然豆包MarsCode AI刷题平台可能最初只提供了某些编程语言的支持,但它具备强大的跨语言代码转换功能,可以将用户的C++代码转换成Java或Python等其他语言的等效代码。这一特性对于那些需要在不同语言环境间切换的开发者来说非常有用,确保了用户能够在任何平台上顺利提交解决方案。
- 实践性与即时反馈:通过实际编写代码并测试示例输入输出,用户可以在提交之前验证自己的解答是否正确。这种即时的反馈机制有助于加深理解,及时调整错误,提高学习效率。
综上所述,豆包MarsCode AI刷题平台具有精准的算法指导、灵活的多语言支持以及即时的实践反馈,为用户提供了一个高效、便捷且富有成效的学习环境。
好了,那么我们这一次的解析就到这里,后面会给大家展示豆包MarsCode AI刷题的更多功能。