【问题标题】:C++ Reverse ArrayC++ 反向数组
【发布时间】:2009-07-15 01:45:43
【问题描述】:

在 C++ 中,我需要:

  • 从用户输入中读取字符串并将其放入 char 数组 [完成]
  • 然后将该数组传递给函数[完成]
  • 该函数应该颠倒字符顺序[问题!]
  • 然后,回到main(),它会显示带有新反转字符的原始数组。

我无法创建实际执行反转的函数,因为我有一些限制:

  • 我不能有任何本地数组 变量。
  • 也没有指针

我的函数只传入原始数组,即:

void reverse(char word[])

编辑:到目前为止,这是我的代码库:

void reverse(char word[]);

void main() 
{
  char word[MAX_SIZE];

  cout << endl << "Enter a word : ";
  cin >> word; 
  cout << "You entered the word " << word << endl;

  reverse(word); 

  cout << "The word in reverse order is " << word << endl;
}

void reverse(char myword[]) 
{
  int i, temp;
  j--;

  for(i=0;i<(j/2);i++) 
  {
    temp      = myword[i];
    myword[i] = myword[j];
    myword[j] = temp; 

    j--; 
  }
}

【问题讨论】:

  • 这是作业吗?对于现实世界,这些限制听起来相当随意。
  • 格雷格,是的 - 这肯定是家庭作业,我也有同样的感觉!
  • j 似乎没有在任何地方声明。我也确定有人希望将答案标记为答案

标签: c++ arrays reverse


【解决方案1】:

尽管这看起来很家庭作业,但我可以建议:

void reverse(char word[])
{
    int len=strlen(word);
    char temp;
    for (int i=0;i<len/2;i++)
    {
            temp=word[i];
            word[i]=word[len-i-1];
            word[len-i-1]=temp;
    }
}

或者,更好的是,经典的 XOR 实现:

void reverse(char word[])
{
    int len=strlen(word);
    for (int i=0;i<len/2;i++)
    {
        word[i]^=word[len-i-1];
        word[len-i-1]^=word[i];
        word[i]^=word[len-i-1];
    }
}

【讨论】:

  • 谢谢戴夫,这真的很有帮助。
  • @dazedandconfused:我在 C++ 相关的工作面试中看到了这个问题。我同意格雷格的观点。了解他的解决方案是如何工作的很重要。在相关说明中,在现实世界中,可以简单地使用标准反向算法来反转数组中字符的顺序,即 std::reverse(word, word + strlen(word))。但是,我不会给你的老师那么简单的解决方案。 :)
  • 使用异或比使用临时对象交换要慢得多。
【解决方案2】:

由于这是家庭作业,我将向您指出解决方案,而不仅仅是给您答案。

你的reverse 函数可以修改传入的word。你需要知道的一件事是单词有多长(这样你就知道要反转多少个字母),你可以得到这个来自strlen() 函数。如果不允许使用指针,则可以使用本地 int 索引变量。

【讨论】:

  • 那么,我应该将我的 char 数组转换为字符串以使用 strlen() 函数吗?
  • 字符串和字符数组完全一样。你可以调用 strlen(word)。
  • 谢谢格雷格,我被它给我的“警告”吓跑了。它建设得很好。
【解决方案3】:

我可以使用算法深度优先搜索为您的问题提供解决方案。

#include <iostream>
#include <vector>
void showContentVector(std::vector<int>& input)
{
    for(int i=0; i<input.size(); ++i)
    {
        std::cout<<input[i]<<", ";
    }
    return;
}
void dfs(int current, int previous, std::vector<int>& input, std::vector<int>& visited)
{
    if(visited[current]==1)
    {
        return;
    }
    visited[current]=1;
    int item=input[current];
    for(int next=(current+1); next<input.size(); ++next)
    {
        if(next==previous)
        {
            continue;
        }
        dfs(next, current, input, visited);
    }
    if(current==input.size()-1)
    {
        input.clear();
    }
    input.push_back(item);
    return;
}
void solve()
{
    const int maximumSize=5;
    std::vector<int> values={1, 2, 3, 4, 5};
    std::vector<int> visited(maximumSize, 0);
    std::cout<<"Before, values <- ";
    showContentVector(values);
    dfs(0, -1, values, visited);
    std::cout<<std::endl<<"After, values <- ";
    showContentVector(values);
    std::cout<<std::endl;
    return;
}
int main()
{
    solve();
    return 0;
}

结果如下:

Before, values <- 1, 2, 3, 4, 5, 
After, values <- 5, 4, 3, 2, 1, 

【讨论】:

    【解决方案4】:

    如果我们在谈论 C-Strings,那么你的函数应该是

    void reverse(char word[],size_t wordlen)
    

    同一个问题的第一个答案(这是Reverse a sentence in C?的骗子)

    这并不能满足您的需求,但可以让您非常接近!

     int ReverseString(char *rev)
             {
                if(*rev!='\0')
                {
                   ReverseString(rev + 1);
                   putchar(*rev);//change this.
                }
    
                return 1;
             }
    

    感谢@devinb。

    【讨论】:

    • 抱歉,这是我忘记提及的另一个限制 - 也不应该使用指针。
    • 这不会返回问题所要求的反转数组。
    • @Greg 哪里说必须返回反转数组?
    • @Tom: "回到 main() 中,它显示带有新反转字符的原始数组"
    • 我会把这个留给你处理@dazedandconfused。
    【解决方案5】:

    //这个程序帮助你找到数组中的最大和最小数

    #include<iostream.h>
    #include<conio.h>
    int main()
    {int max;
    
        int a[5]={12,1,0,4,5};
     int min=a[0];
        int i=1;
        max=a[0];
    
        while(i<=4)
        {
                  if (max < a[i])
                  max=a[i];
                  if (min > a[i])
                  min=a[i];
                  i++;
    
        }
                  cout << min <<"\n";
                  cout << max;
                  getch();
                  return 0;
    }              
    

    【讨论】:

    • 这并不是这个问题的作者真正想要的——他们想要反转一个数组。
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多