2017-03-05 12 views
-3

特殊文字に影響を与えずに配列を逆にすることはできますか?特殊文字とは、 'a'から 'z'、 'A'から 'Z'に含まれない文字を意味します。私はアルゴリズムを構築するためのアイデアが足りない、私はまだそれを把握していない。特殊文字に影響を与えずに配列を逆転する

+0

サンプル入力と出力? –

+1

* "特殊文字には何の影響もありません"とはどういう意味ですか?それらのキャラクターは元に戻らないのですか? – selbie

答えて

1

一つの簡単な解決策は簡単な解決策には次のようになります。

1)は、一時的な文字列を作成します - >例:myArr []。

2)指定された配列からアルファベットをmyArr []にコピーします。

3)標準の文字列反転アルゴリズムを使用してmyArr []を逆順にします。

4)入力文字列とmyArrを1つのループでトラバースします。アルファベット文字が入力文字列であれば、それをmyArr []の現在の文字に置き換えます。

上記の解決策にはほとんど問題がありません。余分なスペースが必要で、入力文字列を2回通過します。 1つのトラバースと余分なスペースなしで逆転できます。以下はアルゴリズムです。

1)LがRよりも小さくなっているものの '

2)L = 0、R = A-1

3)である入力文字列が '[] str' は、文字列の長さとします、次の手順を実行 A)STR [L]はアルファベット文字でない場合は、STR [R]はアルファベット文字でない場合はそうでL ++

B)を行い、

C)そうでない場合、スワップstrをr--のありません[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--; 
     } 
    } 
} 
+0

'else'の最初の3行は、 'std :: swap(array [i]、array [j]); 'で置き換えることができます。それはあなたが2つの要素を交換しているカジュアルな一見ではるかに明確になります。 –

+0

良い点。しかし、私はむしろ、言語プリミティブでもっとも最適なソリューションではなく、アルゴリズムにマップされたときにソリューションが拡張された学習者(*プログラミングの初心者*)を示したいと思います。私はあなたのことを聞いています。 – selbie

-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; 
} 
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]); 
     } 
+1

この回答はC#のように見えますか?質問はC++のタグが付いていますが。 –

関連する問題