我在编程面试中遇到的问题:反转一个字符串,找出数组的模式

Programming interview questions I had: Reverse a string and find the mode of an array

本文关键字:字符串 一个 模式 数组 面试 编程 遇到 问题      更新时间:2023-10-16

我为一家大型科技公司做了一个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循环显然是错误的,至少有两个原因:ij的类型,以及数组的最后一个元素的索引应该是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;
}
编辑:意识到我发布的代码有自己的错误。
相关文章: