我在编程面试中遇到的问题:反转一个字符串,找出数组的模式
Programming interview questions I had: Reverse a string and find the mode of an array
我为一家大型科技公司做了一个c++编程测试。我得到了以下代码块,并要求使用它们来反转字符串并返回数组的模式。
char * reverse(char * str, int n)
{
...
}
和
int mode(int * arr, int n)
{
...
}
我不确定我是否以"最好"的方式做了它们,但我很好奇Stack Overflow的高级牧师会如何做它们。我也很好奇为什么他们在第一个案例中给了我一个如此奇怪的原型。作为一个空函数不是更好吗?两种情况下不都应该用size_t
代替n
吗?
for (char* i(str), j(str+n); i < j; ++i, --j)
std::swap(*i, *j)
return str;
和
if (n == 0)
throw("Can't have the mode of an empty array, bro.")
std::map<int,int> cntMap;
std::pair<int,int> top(arr[0], 1);
cntMap.insert(top);
for (int k(1); k < n; ++k)
{
if (cntMap.count(*k) == 0)
cntMap.insert(*k, 1);
else
++cntMap[*k];
if (cntMap[*k] > top.second)
top = std::make_pair(*k, cntMap[*k])
return top.first;
}
我失败了吗?
第二段代码过于复杂。
你只需要:
++cntMap[*k];
你只需要跟踪最高计数的"k"值,不需要使其成为一对。
第二,你的return top.first;
在循环完成之前,这显然不是你想要的。
您正在使用int k
,然后使用*k
,这显然不会编译。这也适用于reverse
函数中的*i
和*j
。你似乎把整数下标和迭代器混在一起了……
第一个for循环显然是错误的,至少有两个原因:i
和j
的类型,以及数组的最后一个元素的索引应该是str+n-1
for (char *i = str, *j = str+n-1; i < j; ++i, --j)
std::swap(*i, *j)
return str;
对于第一个问题,字符串是否有空终止符?暂时忽略hivert引发的问题(尽管,这是一个非常有效的问题),交换第一个数组值和最后一个数组值将把null字符放在字符串的开头,这对大多数字符串打印函数来说,告诉它们"这里没有字符串"。
另外,您是否确保(n - 1) =字符串长度,还是只是数组大小?如果字符串长度小于(n - 1),那么在空终止符之后会有垃圾数据…您将继续将其交换到字符串的前面,导致大多数字符串打印函数打印垃圾数据,然后在"好的"反转字符串出现之前停止。
所以,你想要做的是:
char * reverse(char * str, int n)
{
// Sanity check, if the string starts with null terminator,
// there's nothing in the string.
if(str[0] = NULL)
{
return str;
}
size_t i, j = 0;
// While you aren't at the end of the array and
// while the next character is not null (0x00)
while((i < n) && (str[i+1] != NULL))
{
i++; // Found another good character
}
// You're going to process the array from both ends.
// i tells you the end, j the front.
while(j < i)
{
// Leaves the null terminator alone.
swap(str[i], str[j]);
i--;
j++;
}
return str;
}
编辑:意识到我发布的代码有自己的错误。