我有一个字符串形式的二进制数
string input = "10110101101";
现在我需要翻转(0 to 1
和1 to 0
)前3位。
结果输出 010 10101101
如何在C#中执行此操作?
答案 0 :(得分:6)
这有效:
string input = "10110101101";
string output =
new string(
input
.Take(3)
.Select(c => c == '0' ? '1' : '0')
.Concat(input.Skip(3))
.ToArray());
它给出了结果:
01010101101
另一种方法是:
string input = "10110101101";
string flips = "11100000000";
int value = Convert.ToInt32(input, 2) ^ Convert.ToInt32(flips, 2);
string output = Convert.ToString(value, 2).PadLeft(input.Length, '0');
答案 1 :(得分:2)
从字符串中取出StringBuilder
,翻转最初的三个字符,然后将StringBuilder
转换回string
:
var sb = new StringBuilder(input);
Debug.Assert(sb.Length >= 3);
for (int i = 0 ; i != 3 ; i++) {
sb[i] = sb[i] == '0' ? '1' : '0';
}
var res = sb.ToString();
有各种“智能”的方法可以无条件地翻转字符,但考虑到数字是string
使得翻盖更智能,不会给你带来太多的CPU周期。
答案 2 :(得分:1)
假设您获得了一个大小为N
的数组a。数组的元素是a[0], a[1], ... a[N - 1]
,其中每个元素都是0
或1
。您可以对阵列执行一次转换:选择任意两个整数L
和R
,并翻转(包括)第L和第R位之间的所有元素。换句话说,L和R表示最左侧和最右侧的索引,用于划分您将决定翻转的段的边界。 ('翻转'意味着,0
转换为1
,1
转换为0
。)
在最终的位串中可以获得的最大“1”位数(由S表示)是多少?
输入格式:
第一行有一个整数N.
接下来的N
行包含数组中的N
元素a[0], a[1], ... a[N - 1]
,每行一个。
例如考虑
1 ≤ N ≤ 100,000.
d can be either 0 or 1. It cannot be any other integer.
0 ≤ L ≤ R < N
Sample Input:
810010010
Sample Output:
6
Explanation:
We can get a maximum of 6 ones in the given binary array by performing either of the following operations:
Flip [1, 5] ⇒ 1 1 1 0 1 1 1 0
or
Flip [1, 7] ⇒ 1 1 1 0 1 1 0 1
<强>解决方案:强> bits数组只包含0和1.所以我们可以将0视为-1,然后任务是查找 subArray的最小总和(以位为单位),即subArray的最大值 (0的数量 - 1的数量)。 我们可以使用与查找最大和subArray相同的方法来查找最小和subArray。在那之前, 我们需要首先遍历位以获得1的原始数。假设最小总和是minRes和 原始数量为1是currentOne。那么minRes应该是一个负数,所以返回currentOne-minRes。 边缘情况: 可以使用上述方法处理所有边缘情况。如果所有元素都是0,那么我们将所有-1加在一起。 如果所有元素都是1,则minRes应为0,这意味着我们不会翻转任何位。 时间:O(n)空间:O(1)
using System;
using System.Linq;
public class Test
{
public static int FlippingBits(int[] bits){
int currentOne = 0; //original number of 1s in bits
foreach(int i in bits){
if(i==1)
currentOne++;
}
int minRes = MinSubArray(bits); //minRes is negative number
return currentOne-minRes;
}
//find the min sum of subArray in bits
private static int MinSubArray(int[] bits){
int minRes = 0, minHere=0;
foreach(int i in bits){
if(i==0)
minHere-=1;
else
minHere+=1;
minHere = Math.Min(minHere,0); //keep minHere<=0
minRes = Math.Min(minHere, minRes);
}
return minRes; //-minRes is the number of 1 can be added to the array after flipping
}
public static void Main()
{
int num = int.Parse(Console.ReadLine());
for(int i=0;i<num;i++){
string[] input = Console.ReadLine().Split();
int[] bits = input.Select(y=>int.Parse(y)).ToArray();
Console.WriteLine(FlippingBits(bits));
}
}
}
答案 3 :(得分:1)
使用error
error
error
error
error
,Convert.ToInt32
(其他未知和未使用过的)和Convert.ToString
bitwise-XOR
只需使用string input = "10110101101";
int flipNo = 3;
int output = Convert.ToInt32(input, 2);
for (int i = input.Length - 1; i >= input.Length - flipNo; --i)
output ^= 1 << i;
,或者如果您想在output
中显示output
,就可以:
string
答案 4 :(得分:-2)
解决方案非常简单;只是XOR值为1(0也可以)。
步骤: