今天还是用豆包MarsCode AI来刷题。
想尝试一下和匹配或者区间相关的题目,选了一些来做。
第一题题目如下:
在看完这道题后,我的第一想法是直接构造一个2维数组X,大小n * n,X[i][j]就代表区间[i,j]的总和。不过这种思想确实太麻烦了,通过豆包MarsCode AI提供了一个更好的思路:
只需要2个一维数组就可以代替这个n * n的2维数组,通过[0,j]-[0,i-1]来得到[i,j]。
第二题题目如下:
看完这道题后,我的想法是构造一个栈来实现,遇到左括号就进栈,遇到右括号就判断是否匹配。当然,这个思想过于简单,且有漏洞。问豆包MarsCode AI来提供思路:
这个时候,我想到了在栈为空的时候右括号是会变成左括号,写出了如下代码:
并在最后进行了一定修改,比如在最后只剩下左括号时modifications += stack.size()/2;而不是豆包MarsCode AI给出的modifications += stack.size();
测了例子,发现全对,但就以为皆大欢喜、已经解决的时候
然后就是让豆包MarsCode AI分析,不过有时候,过于具体的例子会让豆包MarsCode AI的分析结果出现一堆漏洞,比如我把输入的例子告诉了它是"<>{)}[}}[]>[",他会莫名其妙地改变例子变成"<>{)}[}}[]>[]"
在这个输入中"{)}[}}"应该在第二个位置从右括号变成一个左括号,这个时候栈并不是空的,这种情况是之前没有处理的。
这时候就很难依靠豆包MarsCode AI来解决问题了,观察出错例子,发现在右括号进行修改的时候,应该都是有两种情况来考虑,一种是变成万能的左括号,一种是变成对应的右括号,可能可以用递归的思想来实现。
最后,用了一个以前写dfs算法的框架写了一个代码:
我以为终于可以过例子的时候:
在这个输入中,又发现了一个很难绷的问题,在输入"[])({)({]<[}[["中,这里的")("应该变成"()",这个时候,就会发现一个左括号变成了一个右括号。真的是天塌了!
做了这道题1个小时多了,这道题变化的有点让我cpu过载了。最后确实没有做出来,有个挺离谱的思路,就是把每个位置都变化一遍,但是这样的复杂度就是8^n了,这实在是不能接受的复杂度。在网上好像也没有发现这道题的答案(网上好像都只有一种类型的括号或者是增删括号),真是创业未半,中道崩殂(QAQ)。有大佬写了的话能给个题解吗。