2017-03-05 31 views
-3

是否可以顛倒數組而不影響特殊字符?通過特殊字符,我指的是從'a'到'z'和'A'到'Z'的任何字符。我缺乏構建算法的想法,但我仍然沒有想到。顛倒數組而不影響特殊字符

+0

樣品的輸入和輸出? –

+1

*「不影響特殊字符」*是什麼意思?那些角色不會被顛倒過來? – selbie

回答

1

一個簡單的解決辦法是簡單的解決方案:

1)創建臨時字符數組 - >例如:myArr,該[]。

2)將給定數組中的字母字符複製到myArr []。

3)使用標準字符串反轉算法反轉myArr []。

4)現在遍歷一個循環中的輸入字符串和myArr。無論字母字符是輸入字符串,都將其替換爲myArr []的當前字符。

上述解決方案的小問題,它需要額外的空間,並且它會對輸入字符串進行兩次遍歷。 你可以倒過來一個遍歷,沒有額外的空間。以下是算法。

1)設輸入字符串 'str的[]' 和字符串的長度是 '一'

2)L = 0,R = A-1

3)當l爲小於r中,執行以下 一個)如果str [1]是不是字母字符,執行升++

b)否則如果str [R]是不是字母字符,不要R--

C)否則交換STR [l]和str [r]

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'的前三行可以用'std :: swap(array [i],array [j])替換;'除了縮短兩行並且性能完全一樣,真正的勝利就是它會讓你更加清楚地看到你正在交換這兩個元素。 –

+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++。 –