我如何获得我必须旋转二进制输入多少次才能使其在 C# 中以原始形式
How i can get how many times i have to rotate binary input to make it in original form in c#
我需要计算二进制输入需要旋转多少次才能再次获得其原始形式
例如
如果我输入 10101,它需要轮换到 5 个循环移位才能再次变成 10101
如果我输入 010101 它需要轮换到 2 个循环移位再次变成 010101
要么
如果我输入 111111 或 000000,它需要 1 次循环移位才能再次变为 111111 或 000000
我的代码
using System;
class Solution
{
public static void Main(string[] args)
{
var binarayInput = Console.ReadLine();
var a = binarayInput;
var b = binarayInput[^1] + binarayInput[..^1];
Console.WriteLine(b);
var count = 0;
while(a !=b){
b = binarayInput[^1] + binarayInput[..^1];
count ++;
}
Console.WriteLine(count);
}
}
试试这个:
string originalInput = Console.ReadLine()+string.Empty;
Console.WriteLine($"Input: {originalInput}");
string current = string.Join(string.Empty, originalInput.Select(c => c));
for(var i=0; i<originalInput.Length; i+=1) {
var temp = CyclicShift(current);
Console.WriteLine($"Shift {i+1}: {temp}");
if(originalInput.Equals(temp)) {
Console.WriteLine($"Become original after {i+1} shifts.");
break;
}
current = temp;
}
string CyclicShift(string input) {
if(input.Length == 0) return string.Empty;
if(input.Length == 1) return input;
var newStr = input[^1] + input[..^1];
return newStr;
}
测试:
Input: 10101
Shift 1: 11010
Shift 2: 01101
Shift 3: 10110
Shift 4: 01011
Shift 5: 10101
Become original after 5 shifts.
Input: 010101
Shift 1: 101010
Shift 2: 010101
Become original after 2 shifts.
Input: 111111
Shift 1: 111111
Become original after 1 shifts.
如果您使用的是 .Net 6,则可以在临时“构建”旋转字符串时利用 System.Linq
中的 .TakeLast()
and .SkipLast()
。
using System;
using System.Linq;
class Solution
{
public static void Main(string[] args)
{
var binaryInput = Console.ReadLine();
var shifts = 1;
while (binaryInput != string.Join("", binaryInput.TakeLast(shifts).Concat(binaryInput.SkipLast(shifts))))
{
shifts++;
}
Console.WriteLine(shifts);
}
}
当例如shifts == 3
、binaryInput.TakeLast(shifts)
将采用 binaryInput
的最后 3 个字符(转换为 IEnumerable<char>
,因为这是 .TakeLast()
的 return 值它在 string
) 上调用,binaryInput.SkipLast(shifts)
将获取 binaryInput
的所有字符,但 最后三个字符(也转换为 IEnumerable<char>
).
为了将两个IEnumerable<char>
再次拼接成一个字符串,我使用.Concat()
将它们合并为一个IEnumerable<char>
,然后string.Join()
进行转换它是一个可以与 binaryInput
.
进行比较的字符串
Fiddle 试试看 here.
你不需要做一个 substring/one 额外的分配操作来完成这个。
此方法测试(右)移动 offset
的字符串是否等于字符串:
bool CircularEquals(string s, int offset){
for(int i = 0; i < s.Length; i++)
if(s[i] != s[(i+offset) % s.Length])
return false;
return true;
}
它的工作原理是在概念上建立两个指向字符串中字符的指针,并将它们逐一推进。当“右移”指针离开字符串的末尾时,模数再次将其环绕
例如移动 2:
10101
^
^ 1 == 1, loop continues
10101
^
^ 0 == 0, loop continues
10101
^
^ 1 == 1, loop continues
10101
^
^ 0 != 1, returns false. 10101 doesn't work if shifted 2
您可以测试每个班次:
var s = "10101";
for(int i = 1; i <= s.Length; i++){
if(CircularEquals(s,i))
Console.WriteLine("String " + s + " is identical after " + i + " shifts");
}
这是另一种方法:
我们获取字符串,将其连接到自身一次,然后询问原始字符串在新字符串中的第一个索引是什么(从 1 开始;如果我们从 0 开始,它将始终匹配,因为零移位始终匹配):
var s = "10101";
var shiftsNeeded = (s+s).IndexOf(s, 1);
它的工作原理如下:
"1010110101".IndexOf("10101", 1)
Start at 1:
1010110101
10101 -> index 1? no
1010110101
10101 -> index 2? no
1010110101
10101 -> index 3? no
1010110101
10101 -> index 4? no
1010110101
10101 -> index 5? yes
我需要计算二进制输入需要旋转多少次才能再次获得其原始形式 例如 如果我输入 10101,它需要轮换到 5 个循环移位才能再次变成 10101 如果我输入 010101 它需要轮换到 2 个循环移位再次变成 010101 要么 如果我输入 111111 或 000000,它需要 1 次循环移位才能再次变为 111111 或 000000
我的代码
using System;
class Solution
{
public static void Main(string[] args)
{
var binarayInput = Console.ReadLine();
var a = binarayInput;
var b = binarayInput[^1] + binarayInput[..^1];
Console.WriteLine(b);
var count = 0;
while(a !=b){
b = binarayInput[^1] + binarayInput[..^1];
count ++;
}
Console.WriteLine(count);
}
}
试试这个:
string originalInput = Console.ReadLine()+string.Empty;
Console.WriteLine($"Input: {originalInput}");
string current = string.Join(string.Empty, originalInput.Select(c => c));
for(var i=0; i<originalInput.Length; i+=1) {
var temp = CyclicShift(current);
Console.WriteLine($"Shift {i+1}: {temp}");
if(originalInput.Equals(temp)) {
Console.WriteLine($"Become original after {i+1} shifts.");
break;
}
current = temp;
}
string CyclicShift(string input) {
if(input.Length == 0) return string.Empty;
if(input.Length == 1) return input;
var newStr = input[^1] + input[..^1];
return newStr;
}
测试:
Input: 10101
Shift 1: 11010
Shift 2: 01101
Shift 3: 10110
Shift 4: 01011
Shift 5: 10101
Become original after 5 shifts.
Input: 010101
Shift 1: 101010
Shift 2: 010101
Become original after 2 shifts.
Input: 111111
Shift 1: 111111
Become original after 1 shifts.
如果您使用的是 .Net 6,则可以在临时“构建”旋转字符串时利用 System.Linq
中的 .TakeLast()
and .SkipLast()
。
using System;
using System.Linq;
class Solution
{
public static void Main(string[] args)
{
var binaryInput = Console.ReadLine();
var shifts = 1;
while (binaryInput != string.Join("", binaryInput.TakeLast(shifts).Concat(binaryInput.SkipLast(shifts))))
{
shifts++;
}
Console.WriteLine(shifts);
}
}
当例如shifts == 3
、binaryInput.TakeLast(shifts)
将采用 binaryInput
的最后 3 个字符(转换为 IEnumerable<char>
,因为这是 .TakeLast()
的 return 值它在 string
) 上调用,binaryInput.SkipLast(shifts)
将获取 binaryInput
的所有字符,但 最后三个字符(也转换为 IEnumerable<char>
).
为了将两个IEnumerable<char>
再次拼接成一个字符串,我使用.Concat()
将它们合并为一个IEnumerable<char>
,然后string.Join()
进行转换它是一个可以与 binaryInput
.
Fiddle 试试看 here.
你不需要做一个 substring/one 额外的分配操作来完成这个。
此方法测试(右)移动 offset
的字符串是否等于字符串:
bool CircularEquals(string s, int offset){
for(int i = 0; i < s.Length; i++)
if(s[i] != s[(i+offset) % s.Length])
return false;
return true;
}
它的工作原理是在概念上建立两个指向字符串中字符的指针,并将它们逐一推进。当“右移”指针离开字符串的末尾时,模数再次将其环绕
例如移动 2:
10101
^
^ 1 == 1, loop continues
10101
^
^ 0 == 0, loop continues
10101
^
^ 1 == 1, loop continues
10101
^
^ 0 != 1, returns false. 10101 doesn't work if shifted 2
您可以测试每个班次:
var s = "10101";
for(int i = 1; i <= s.Length; i++){
if(CircularEquals(s,i))
Console.WriteLine("String " + s + " is identical after " + i + " shifts");
}
这是另一种方法:
我们获取字符串,将其连接到自身一次,然后询问原始字符串在新字符串中的第一个索引是什么(从 1 开始;如果我们从 0 开始,它将始终匹配,因为零移位始终匹配):
var s = "10101";
var shiftsNeeded = (s+s).IndexOf(s, 1);
它的工作原理如下:
"1010110101".IndexOf("10101", 1)
Start at 1:
1010110101
10101 -> index 1? no
1010110101
10101 -> index 2? no
1010110101
10101 -> index 3? no
1010110101
10101 -> index 4? no
1010110101
10101 -> index 5? yes