编程面试问题我有:反转字符串并找到数组的模式

时间:2014-03-27 22:10:43

标签: c++ algorithm

我为一家大型科技公司进行了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;       
}

我失败了吗?

3 个答案:

答案 0 :(得分:4)

第一个for循环显然是错误的,至少有两个原因:ij的类型,以及数组的最后一个元素的索引str+n-1 < / p>

for (char *i = str, *j = str+n-1; i < j; ++i, --j)
    std::swap(*i, *j)
return str;

答案 1 :(得分:4)

你的第二个代码太复杂了。

你只需要:

++cntMap[*k];

你只需要跟踪&#39;&#39;最高计数值,无需成为一对。

其次,你的return top.first;在循环结束之前,这显然不是你想要的。

您正在使用int k,然后使用*k,这显然无法编译。这也适用于*i函数中的*jreverse。你好像在混合整数索引和迭代器......

答案 2 :(得分:1)

对于第一个问题,字符串是否具有空终止符?暂时忽略引发的问题(尽管这是一个非常有效的问题),交换第一个数组值和最后一个数组值会将空字符放在字符串的开头,这对于大多数字符串打印功能,告诉他们&#34;这里没有字符串&#34;。

另外,你确定(n - 1)=字符串长度,或只是数组大小?如果字符串长度小于(n-1),则会有空终止符之后的垃圾数据...您将继续交换到字符串的前面,导致大多数字符串打印功能打印垃圾数据,然后在&#34; good&#34;之前停止逆弦甚至出现了。

所以,你想要做的事情是:

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;
}

编辑:意识到我发布的代码有自己的错误。为角落案件而欢呼。