是否可以在不影响特殊字符的情况下反转数组?特殊字符,我的意思是“' a'到' z'和' A'到' Z'我缺乏构建算法的想法,我还没想到它。
答案 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;
}