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]);
我得到的編譯錯誤是:
無法應用操作 '|'到操作數字節[]和字節[]
我也試過BitArray,但這似乎並不正確。我嘗試了byte.Parse(「10101」),這隻會導致溢出,這對我來說很有意義。
我想要做的是或者兩個字符串的位和結果會= 1,也許我需要通過for循環中的位移動,我想也許我可以只是或二者的二進制表示匹配長度二進制字符串
顯然我選擇了錯誤的數據類型,字節[],來存儲我的二進制字符串,我只是沒有足夠的經驗知道如何代表了正確的數據類型,這些二進制字符串。
UPDATE
這很難選擇一個正確的答案,因爲有多個正確答案。只是想清楚,提出這個問題的多種解決方案是很好的答案。
我的問題導致的一個問題,我試圖解決的HackerRank:https://www.hackerrank.com/challenges/acm-icpc-team
「你給誰出席ACM-ICPC全球總決賽N多人的名單他們每個人要麼以及在精通或者他們不是,找出一個2人團隊可以知道的最大主題數量,並且找出有多少個團隊可以知道最多的主題。
感謝幫助我的堆棧溢出收到我想出了一個不壞的解決方案:
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位塊,如字節區域,分割長二進制字符串,看看是否有效,而不是瀏覽字符串的每個字符。
最初我開始把大的二進制字符串分解成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;
}
什麼是你看到的編譯器錯誤/警告?你是否需要將二進制字符串存儲在一個對象中?爲什麼不只是兩個變量和'|'他們? – Tim
將它們解析爲整數,然後使用or運算符? – cubrr
錯誤是無法應用運算符'|'到操作數字節[]和字節[] –