所以我正在处理这个问题:https://www.hackerrank.com/challenges/30-review-loop/problem(它在C#中)
到目前为止,我只是试图一点一点地分解它,到目前为止,我能够让它显示其他所有角色,但我不确定如何将每个字母连接成一个新的字符串。我的问题代码如下:我已经注释掉了两个for循环,因为我觉得有一个比我更优雅的解决方案,但我不想失去我遇到的其他路径被证明更具挑战性。
using System;
using System.Collections.Generic;
using System.IO;
class Solution {
static void Main(String[] args) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution */
int inputQTY = Int32.Parse(Console.ReadLine());
string input = Console.ReadLine(); // The example gives us the first word to be Hacker then the next word Rank on the next line, so the outputs would be Hce akr, and Rn ak respectively.
int strLen = input.Length;
char[] inputCharArray = input.ToCharArray();
string output = "";
/*
for (int j = 0; j < inputQTY; j++){
for (int i = 0; i < strLen; i++) {
if (j % 2 == 0 && i % 2 == 0) {
Console.WriteLine(inputCharArray[i]);
output = new string (new char[] {inputCharArray[i]});
Console.WriteLine(output);
Console.WriteLine("This is i: {0}", i);
Console.WriteLine("This is j: {0}", j);
Console.WriteLine("--------------");
Console.WriteLine("");
}
else {
Console.WriteLine("This is the next j part hopefully: {0}", j);
}
}
}*/
}
}
就像我理解的那样,我需要首先逐字逐句,抓住所有其他字母,然后再次单词并抓住剩余的字母,然后将这些字母连接成单词,并将这些单词连接成一个句子,所以j会是循环给我两个单词,我是循环让两个单词放在一起.....但我很难把我的脑袋缠绕在这里,我在这里出错了。除此之外,我觉得还有另一种方法,我完全不知道,使用我可能甚至不知道的命令。
Anyhoo对任何帮助表示赞赏,希望在此之后我不会那么开心。谢谢!
好的,所以我最终用以下代码解决了它,谢谢大家的帮助!
我最终使用以下代码(在C#中)解决它:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
class Solution {
static void Main(String[] args) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution */
int count = Int32.Parse(Console.ReadLine());
for (int k = 0; k < count; k++) {
char[] word = Console.ReadLine().ToCharArray();
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < word.Length; i+=2) {
sb1.Append(word[i]);
}
for (int j = 1; j < word.Length; j+=2) {
sb2.Append(word[j]);
}
Console.WriteLine(sb1 + " " + sb2);
}
}
}
答案 0 :(得分:4)
LINQ版本,已更新以修复索引错误:
output = $"{new string(s.Where((x,i) => i % 2 == 0).ToArray())} {new string(s.Where((x,i) => i % 2 != 0).ToArray())}";
为了解释,你要抓住字符串中索引可被2整除并打印的每个字符,然后字符串中每个字符的索引不能被2整除并打印出来。
更新
因为我被要求进一步解释。首先,这里是在HackerRank挑战中成功运行的完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
class Solution
{
static void Main(String[] args)
{
List<string> tests = new List<string>();
var testCount = int.Parse(Console.ReadLine());
for (var i = 0; i < testCount; i++)
{
tests.Add(Console.ReadLine());
}
foreach (var s in tests)
{
Console.WriteLine($"{new string(s.Where((x, i) => i % 2 == 0).ToArray())} {new string(s.Where((x, i) => i % 2 != 0).ToArray())}");
}
}
}
关于代码的每个部分:
i % 2 == 0
这是一个测试,看一个数字是否可以被2或偶数整除。
s.Where((x,i) => i % 2 == 0)
这就是说,对于构成字符串&#39;的字符数组,返回所有字符(结果是IEnumerable),其中该字符的索引(字符串中的位置)是一个偶数。
new string(s.Where((x,i) => i % 2 == 0).ToArray())
这就是说使用带有偶数索引的IEnumerable字符并将它们返回到一个字符数组。然后,从该字符数组中创建一个新字符串。
对于奇数,它是相同的,但你在mod中使用!= 0.
答案 1 :(得分:2)
我使用这种附加到两个StringBuilder对象的简单方法
owner
答案 2 :(得分:2)
这是漫长的道路..
int count = int.Parse(Console.ReadLine());
for(int k = 0; k < count; k++){
char[] inputChars = Console.ReadLine().ToCharArray();
char[] evenChars = new char[inputChars.Length % 2 == 0 ? inputChars.Length / 2 : (inputChars.Length + 1) / 2];
char[] oddChars = new char[inputChars.Length - evenChars.Length];
int evenIndex=0,oddIndex = 0;
for(int i = 0; i < inputChars.Length;i++)
if(i % 2 == 0)
evenChars[evenIndex++] = inputChars[i];
else
oddChars[oddIndex++] = inputChars[i];
Console.WriteLine(string.Format("{0} {1}",string.Concat(evenChars),string.Concat(oddChars)));
}
替代..
int count = int.Parse(Console.ReadLine());
for(int k = 0; k < count; k++){
string input = Console.ReadLine();
Enumerable.Range(0, input.Length)
.OrderBy(o => o % 2 != 0)
.Select(o => {
if(o == 1)
Console.Write(" ");
Console.Write(input[o]);
return input[o];
}).ToArray();
Console.Write("\n");
}