问题描述
我是在 leetcode 上解决这个问题的 -
示例 1:
输入:s = ["h","e","l","o"] 输出:["o","h" ] 例子 2:
输入:s = ["H","a","n","h"] 输出:["h","H"]
我写了这个解决方案,它给出了一个运行时错误:无符号偏移量的添加
class Solution {
public:
void funToReverse(int left,int right,vector<char> &s){
if(left==right)
return;
else{
char temp = s[left];
s[left]=s[right];
s[right]=temp;
funToReverse(left+1,right-1,s);
}
}
void reverseString(vector<char>& s) {
int left =0;
int right = s.size()-1;
funToReverse(left,right,s);
}
};
错误:
第 1034 行:字符 34:运行时错误:将无符号偏移添加到 0x6020000001b0 溢出到 0x6020000001af (stl_vector.h) 总结: UndefinedBehaviorSanitizer:未定义行为 /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:34
解决方法
问题在于,left
和 right
可能会相互传递,而不会是相同的值。解决这个问题的方法是:
class Solution {
public:
void funToReverse(int left,int right,vector<char> &s){
if(left>=right) // Check if left has reached right
return;
else{
char temp = s[left];
s[left]=s[right];
s[right]=temp;
funToReverse(left+1,right-1,s);
}
}
void reverseString(vector<char>& s) {
int left =0;
int right = s.size()-1;
funToReverse(left,right,s);
}
};
如果有奇数个元素,那么 (left,right) 是这样的: (0,4),(1,3),(2,2)
然而,如果元素个数为偶数,left 将通过 right 但永远不会相同:(0,5),(3,2),(4,1),(5,0),(6,-1)
请注意,在这种情况下,left
一直到 6,而 right
一直到 -1,这是无效的。