连接 char 数组时出现意外的 \u0000 insted of '0'
Unexpected \u0000 insted of '0' when concatenate char arrays
我在 leetcode 上遇到了意想不到的 \u0000:
相同的代码在 linqpad 中本地运行良好:
public string AddBinary(string a, string b)
{
var result = a.Length > b.Length
? new char[a.Length]
: new char[b.Length];
result.Dump();
bool carry = false;
var iA = a.Length - 1;
var iB = b.Length - 1;
while (!(iA < 0 && iB < 0))
{
var bA = iA < 0 ? false : a[iA] == '1';
var bB = iB < 0 ? false : b[iB] == '1';
//char cA = iA < 0 ? '-' : a[iA];
//char cB = iB < 0 ? '-' : b[iB];
//$"string a. i = {iA} cA = '{cA}' {bA}".Dump();
//$"string b. i = {iB} cB = '{cB}' {bB}".Dump();
bool bCurrent = bA ^ bB ^ carry;
int position = iA < 0 ? iB : iA;
result[position] = bCurrent ? '1' : '0';
carry = carry
? !(!bA && !bB)
: bA && bB;
iA--;
iB--;
}
result.Dump();
if(!carry)
return new string(result);
var newResult = new char[result.Length + 1];
newResult[0] = '1';
for (int i = 0; i < result.Length; i++)
{
newResult[i+1] = result[i];
result[i].Dump();
}
result.Dump();
var ab = new string(newResult);
DisplayString(ab);
ab.Dump();
return ab;
//var one = new char[] { '1' };
//result.Dump();
//var newResult = one.Concat(result);
//newResult.Dump();
//var r = new string(newResult.ToArray());
//r.Dump();
//return r;
}
(请参阅 John's Skeet page 处的 DisplayString 定义)
这里是这个测试用例中的一些调试信息:
第二个版本有同样的错误:
所以,没有 \u0000 来自哪里。这是一个错误吗?或者也许我错过了什么?
位置计算错误:
int position = iA >= iB ? iA : iB;
您需要使用最高排名。
如您所写,使用 1
和 111
,在第一个循环中您有:iA == 0
、iB == 2
、position == 0
而不是 position == 2
(所以你写的是第一个元素而不是最后一个)
我在 leetcode 上遇到了意想不到的 \u0000:
相同的代码在 linqpad 中本地运行良好:
public string AddBinary(string a, string b)
{
var result = a.Length > b.Length
? new char[a.Length]
: new char[b.Length];
result.Dump();
bool carry = false;
var iA = a.Length - 1;
var iB = b.Length - 1;
while (!(iA < 0 && iB < 0))
{
var bA = iA < 0 ? false : a[iA] == '1';
var bB = iB < 0 ? false : b[iB] == '1';
//char cA = iA < 0 ? '-' : a[iA];
//char cB = iB < 0 ? '-' : b[iB];
//$"string a. i = {iA} cA = '{cA}' {bA}".Dump();
//$"string b. i = {iB} cB = '{cB}' {bB}".Dump();
bool bCurrent = bA ^ bB ^ carry;
int position = iA < 0 ? iB : iA;
result[position] = bCurrent ? '1' : '0';
carry = carry
? !(!bA && !bB)
: bA && bB;
iA--;
iB--;
}
result.Dump();
if(!carry)
return new string(result);
var newResult = new char[result.Length + 1];
newResult[0] = '1';
for (int i = 0; i < result.Length; i++)
{
newResult[i+1] = result[i];
result[i].Dump();
}
result.Dump();
var ab = new string(newResult);
DisplayString(ab);
ab.Dump();
return ab;
//var one = new char[] { '1' };
//result.Dump();
//var newResult = one.Concat(result);
//newResult.Dump();
//var r = new string(newResult.ToArray());
//r.Dump();
//return r;
}
(请参阅 John's Skeet page 处的 DisplayString 定义)
这里是这个测试用例中的一些调试信息:
第二个版本有同样的错误:
所以,没有 \u0000 来自哪里。这是一个错误吗?或者也许我错过了什么?
位置计算错误:
int position = iA >= iB ? iA : iB;
您需要使用最高排名。
如您所写,使用 1
和 111
,在第一个循环中您有:iA == 0
、iB == 2
、position == 0
而不是 position == 2
(所以你写的是第一个元素而不是最后一个)