在不影响特殊字符的情况下反转数组

时间:2017-03-05 06:25:50

标签: c++

是否可以在不影响特殊字符的情况下反转数组?特殊字符,我的意思是“' a'到' z'和' A'到' Z'我缺乏构建算法的想法,我还没想到它。

4 个答案:

答案 0 :(得分:1)

一个简单的解决方案是Simple Solution:

1)创建一个临时字符数组 - >例如:myArr []。

2)将给定数组中的字母字符复制到myArr []。

3)使用标准字符串反转算法反转myArr []。

4)现在在单个循环中遍历输入字符串和myArr。只要字母字符是输入字符串,请将其替换为myArr []的当前字符。

上述解决方案的问题很少,它需要额外的空间,并且它会对输入字符串进行两次遍历。 您可以通过一次遍历进行反转,而无需额外空间。以下是算法。

1)让输入字符串为'str []',字符串长度为'a'

2)l = 0,r = a-1

3)当l小于r时,请执行以下操作    a)如果str [l]不是字母字符,请执行l ++

b)否则如果str [r]不是字母字符,请执行r -

c)否则交换str [l]和str [r]

答案 1 :(得分:1)

这是一个能够做到这一点的解决方案"到位"一次通过。

bool isspecial(char c)
{
    if ((c >= 'a') && (c <= 'z')) return false;
    if ((c >= 'A') && (c <= 'Z')) return false;
    return true;
}

void rev(char* array, int N)
{
    int i = 0;     // i points to the first index of the array 
    int j = N - 1; // j points to the last index of the array

    while (i < j)
    {
        if (isspecial(array[i]))
        {
            i++;
        }
        else if (isspecial(array[j]))
        {
            j--;
        }
        else
        {
            char tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;
            i++;
            j--;
        }
    }
}

答案 2 :(得分:0)

        Console.WriteLine("enter any string");
        string str = Console.ReadLine();
        string[] revstr = new string[str.Length];
        for (int i = 0; i < str.Length; i++)
        {
            int ch = Convert.ToInt16(str.ToLower()[i]);
            if ((ch < 97 || ch > 122))
            {
                revstr[i] = str[i].ToString();
            }
        }
        for (int k = str.Length - 1; k >= 0; k--)
        {
            int ch = Convert.ToInt16(str.ToLower()[k]);
            if (!(ch < 97 || ch > 122))

            {
                for (int j = 0; j < str.Length; j++)
                {
                    if (revstr[j] == null)
                    {
                        revstr[j] = str[k].ToString();
                        break;
                    }
                }
            }
        }
        for (int s = 0; s < revstr.Length; s++)
        {
            Console.Write(revstr[s]);
        }

答案 3 :(得分:-1)

如果您希望特殊字符的位置保持不变,并且要反转字符串的其余部分,那么这应该有效 -

#include <iostream>
using namespace std;

void swap(char& a, char& b)
{
    char temp = a;
    a = b;
    b = temp;
}

int main()
{
   string s = "Hell$o World"; 
   for(int i = 0, j = s.length() -1;i < s.length()/2; i++, j--) {
       while((s[i] <= 'a' && s[i] >= 'Z') || s[i] >= 'z' || s[i] <= 'A') {
           i++;
       }
       while((s[j] <= 'a' && s[j] >= 'Z') || s[j] >= 'z' || s[j] <= 'A') {
           j--;
       }
       swap(s[i], s[j]);
   }
   cout << s << endl;     //dlro$W olleH
   return 0;
}
相关问题