gpt4 book ai didi

c# - 如何在 C# 中存储两个二进制字符串并使用 OR 运算符

转载 作者:太空狗 更新时间:2023-10-30 00:23:51 25 4
gpt4 key购买 nike

输入:

10101
11100

我想将这两个字符串存储在一个数据类型中,以便我可以对这两个字符串调用 | OR 运算符。

这是我的代码:

        var g = new byte[2][];

g[0] = "10101".Select(item => byte.Parse(item.ToString())).ToArray();
g[1] = "11100".Select(item => byte.Parse(item.ToString())).ToArray();

//won't compile
Console.WriteLine(g[0] | g[1]);

我得到的编译器错误是:

无法应用运算符“|”到操作数 byte[] 和 byte[]

我也试过 BitArray 但这似乎也不对。我尝试了 byte.Parse("10101") ,它只会导致溢出,这对我来说很有意义。

我想做的是对两个字符串的位进行 OR,结果 = 1,也许我需要在 for 循环中移动这些位,我想也许我可以只对两个字符串的二进制表示进行 OR匹配长度的二进制字符串

显然我选择了错误的数据类型 byte[] 来存储我的二进制字符串,我只是经验不足,不知道如何用正确的数据类型表示这些二进制字符串。

更新

很难选择一个正确的答案,因为有多个正确答案。只是想说明一下,这个问题有多种解决方案,都是很好的答案。

我的问题源于我试图在 HackerRank 上解决的问题:https://www.hackerrank.com/challenges/acm-icpc-team

“给你一份参加 ACM-ICPC 世界总决赛的 N 人的名单。他们每个人要么精通某个主题,要么不精通。找出一个 2 人团队可以知道的主题的最大数量. 并找出有多少团队可以知道最大数量的主题。”

感谢我在 Stack Overflow 上获得的帮助,我想出了一个不错的解决方案:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class Solution {
static void Main(String[] args) {
var inputArr = Console.ReadLine().Split(' ').Select(item => int.Parse(item)).ToArray();
var n = inputArr[0];
var m = inputArr[1];


var g = new byte[n];
var team = new List<byte>();

var teamsKnowMax = 0;
var maxTopics = byte.MinValue >> sizeof(byte) * 8 - m;

for(var i = 0; i < n; i++){
g[i] = Convert.ToByte(Console.ReadLine(), 2);
maxTopics = maxTopics | g[i];
}

for(var j = 0; j < n -1; j++){
for(var k = j+1; k < n; k++){
var or = g[j] | g[k];
if((or & maxTopics) == maxTopics)
teamsKnowMax++;
}
}

Console.WriteLine(Convert.ToString(maxTopics,2).ToCharArray().Count(item => item == '1'));
Console.WriteLine(teamsKnowMax);
}

但我没有考虑约束条件:

2≤N≤500 
1≤M≤500

所以现在我需要研究一个解决方案,将长二进制字符串分解为 8 位 block ,例如将长二进制字符串分解的字节区域,看看是否可行,而不是这样做而不是遍历每个字符字符串。

最初,我开始将大型二进制字符串分解为 8 段,如果有则处理提醒,这创建了一个我无法管理的复杂数据结构。通常,解决这些算法就是从一开始就选择正确的数据结构。然后我回到 BitArray,这给了我一些我能做的事情 | OR 即使二进制字符串非常大。感谢此链接和内容提供商:https://codereview.stackexchange.com/questions/80458/acm-icpc-team-challenge-on-hackerrank-easy

   static void Main(String[] args) {
var input = Console.ReadLine().Split(' ').Select(item => int.Parse(item)).ToArray();
var N = input[0];
var M = input[1];
var maxTopics = 0;
var maxTeams = 0;
var bitArray = new BitArray[N];

for(var n = 0; n < N; n++){
bitArray[n] = new BitArray(M);

var topics = Console.ReadLine();

for(var m = 0; m < M; m++){
bitArray[n].Set(m, topics[m] == '1');
}
}

for(int i = 0; i < N -1; i ++){
for(int j = i + 1; j < N; j++){
var tempTopics = BitsOnCount(new BitArray(M).Or(bitArray[i]).Or(bitArray[j]));

if (tempTopics > maxTopics){
maxTopics = tempTopics;
maxTeams = 1;
}else if(tempTopics == maxTopics){
maxTeams++;
}

}
}

Console.WriteLine(maxTopics);
Console.WriteLine(maxTeams);
}

static int BitsOnCount(BitArray bitArray)
{
var count = 0;
foreach (var bit in bitArray)
{
if ((bool) bit)
count++;
}

return count;
}

最佳答案

只有操作数字,没有循环,LINQ等的解决方案应该是最好的性能。

var str1 = "10101";
var str2 = "11100";

var num1 = Convert.ToByte(str1, 2);
var num2 = Convert.ToByte(str2, 2);
var or = num1 | num2;

// We need to lookup only that bits, that are in original input values.
// So, create a mask with the same number of bits.
var mask = byte.MaxValue >> sizeof(byte) * 8 - Math.Max(str1.Length, str2.Length);
var result = (or & mask) == mask;

// True, when all bits after OR are 1, otherwise - False.
Console.WriteLine(result);

关于c# - 如何在 C# 中存储两个二进制字符串并使用 OR 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com