我正在尝试创建一个代替另一个角色的程序。我创建了两个数组,奇数和偶数如下:
char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
char[] even ={ 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
现在,如果输入是'a',则必须输入'b',如果输入为'b',它必须打印'a'。
所以我认为最好匹配两个数组的索引,因为它们具有相同的计数。基本的想法是:
输入是'a',因此编译器会将'a' - 0的索引考虑在内,并使用索引0替换该值 - < EM> 'b'。
所以我考虑分配一个备用字符'j',它将找到输入的索引并输出数组中相应的字符 - even[]
。
我尝试了几次但无法得到解决方案。请帮助我...
这是我尝试过的。
所需的输入可能是这样的:你好 所需的输出应为:Gfkkp
据说这给了我想要的结果。
private void superSecretFormula(string myName)
{
string read = myName;
int count = read.Length;
char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
//char[] j;
char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
for (int i = 0; i < count; i++)
{
for (int j = 0; j < 13 ; j++)
{
if (read[i]==odd[j])
{
int k = j;
textBlock1.Text = textBlock1.Text + Convert.ToString(char.ToUpperInvariant(even[k]));
}
if (read[i] == even[j])
{
int k = j;
textBlock1.Text = textBlock1.Text + Convert.ToString(char.ToUpperInvariant(odd[k]));
}
}
}
}
请注意解决这个问题的质量和方法,因为我是新手,我现在才开始学习代码。感谢
答案 0 :(得分:4)
假设您的所有替换都是唯一的,我会考虑将您的结构更改为类似的内容以便于使用。
class Program
{
static void Main(string[] args)
{
var subs = new Substitutes {{'a', 'b'}, {'c', 'd'}};
Console.WriteLine(subs['a']); //Prints b
Console.WriteLine(subs['b']); //Prints a
}
class Substitutes : Dictionary<char, char>
{
public new void Add(char item, char substitute)
{
base.Add(item, substitute);
base.Add(substitute, item);
}
}
}
现在,通过检查密钥是否存在,替换字符串中的所有字符将是微不足道的。
答案 1 :(得分:0)
我不确切知道你需要帮助的地方。一个小函数,用odd
中相应的字符串替换even
中包含的字符串的每个字符,反之亦然,如下所示:
static char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
static char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
static string Substitute(string input)
{
char[] result = new char[input.Length];
int i = 0;
bool found = false;
foreach (char c in input.ToCharArray())
{
found = false;
result[i] = c;
for (int j = 0; j < odd.Length; j++)
{
if (odd[j] == c)
{
result[i] = even[j];
found = true;
break;
}
}
if (!found)
{
for (int j = 0; j < even.Length; j++)
{
if (even[j] == c)
{
result[i] = odd[j];
break;
}
}
}
i++;
}
return new string(result);
}
您还可以通过创建从每个输入字符到输出字符的某种映射来优化它,只需创建一次并缓存然后:
static char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
static char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
static int[] mapping = null;
static string Substitute(string input)
{
if (mapping == null)
{
mapping = new int[Math.Max(odd.Select(x => (int)x).Max(), even.Select(x => (int)x).Max()) + 1];
for (int i = 0; i < mapping.Length; i++) mapping[i] = i;
// Note: Make sure 'odd' and 'even' are arrays of the same length
for (int i = 0; i < odd.Length; i++) mapping[(int)odd[i]] = (int)even[i];
for (int i = 0; i < even.Length; i++) mapping[(int)even[i]] = (int)odd[i];
}
char[] result = new char[input.Length];
int j = 0;
foreach (char c in input.ToCharArray())
{
int charcode = (int)c;
result[j] = charcode >= mapping.Length ? c : (char)mapping[charcode];
j++;
}
return new string(result);
}
答案 2 :(得分:0)
以最少的修改坚持你原来的想法。
Array.IndexOf(odd, 'a'); //will return 0
Array.IndexOf(odd, 'b')' //will return -1
左右....
if(Array.IndexOf(odd, inputChar) > -1 )
{
Console.WriteLine(even[Array.IndexOf(odd, inputChar)]);
}
else
{
Console.WriteLine(odd[Array.IndexOf(even, inputChar)]);
}
答案 3 :(得分:0)
一种方法是创建一个类,该类保存对包含应该转置的字母的两个字典的引用;类似于OP的原始两个阵列。然后创建一个转换输入字符串的方法:
public class TransposeLetters
{
public Dictionary<char, char> Odd { get; private set; }
public Dictionary<char, char> Even { get; private set; }
public TransposeLetters()
{
Odd = new Dictionary<char, char>();
// capital leters
for( int i = 65; i <= 90; i += 2 )
{
Odd.Add( (char)i, (char)( i + 1 ) );
}
// small letters
for( int i = 97; i <= 122; i += 2 )
{
Odd.Add( (char)i, (char)( i + 1 ) );
}
Even = Odd.ToDictionary( x => x.Value, x => x.Key );
}
public string Convert( string str )
{
// ensure only letters are passed into the method
var cleansed = str.Where( char.IsLetter );
var transposed = cleansed.Select( x => Odd.ContainsKey( x ) ? Odd[x] : Even[x] );
var result = new string( transposed.ToArray() );
return result;
}
}