有一个1's
和0's
字符串,例如110001110
。我已经给出了两个数字k
和p
,我必须通过执行p
检查我是否可以连续1's
个0's
或k
交换和交换我的意思是,如果它是1
,那么将它0
,反之亦然。
1110000111
,让p = 3
和k = 1
。因此,我可以通过1次掉头获得至少3个连续1's
或0's
,其答案为yes
,因为我可以将其更改为1110010111
。
答案 0 :(得分:1)
您可以通过简单的循环在线性时间内完成此操作。在检测到全部0或全部1的单调序列后,您将计算使用简单公式需要多少次翻转。除了 p 为1的情况外,这些翻转总是可以使得该序列的外部数字保持不变。在这种情况下,必须使翻转得到01010101。 ..或者101010101 ....也可以使用简单的模数表达式完成。然后将采取两者中最好的(交换次数减少)。
以下是JavaScript中的一个实现,其中包含针对通用案例(p> 1)的两个示例运行以及提到的特殊情况(p = 1):
function swapsForMaxSequence(s, maxSize) {
var head, tail, swaps;
if (maxSize < 1) return false;
swaps = 0;
if (maxSize === 1) { // Special case
// 0 and 1 should be alternating:
for (head = 0; head < s.length; head++) { // n iterations
if (Number(s[head]) == head % 2) swaps++;
}
// Either the made swaps or the opposite swaps would do it:
return Math.min(swaps, s.length - swaps);
}
tail = 0;
for (head = 1; head <= s.length; head++) { // n iterations
if (head === s.length || s[head] != s[tail]) { // end of sequence?
swaps += Math.floor((head - tail)/(maxSize+1));
tail = head; // Start of new sequence
}
}
return swaps;
}
// Sample input:
var s = '10110101010', // Special case
k = 1,
p = 1;
// Display input:
console.log('s:', s, 'k:', k, 'p:', p);
// Run the algorithm
result = swapsForMaxSequence(s, p);
// Display outcome:
console.log('result:', result);
// Second sample:
var s = '1110000111', // Special case
k = 1,
p = 3;
// Display input:
console.log('s:', s, 'k:', k, 'p:', p);
// Run the algorithm
result = swapsForMaxSequence(s, p);
// Display outcome:
console.log('result:', result);