标签:mixs ... 二进制 t0 t1 let 字符 字符串 else
一、问题
二、问题分析
这问题跟之前交换二进制字符串挺像的,刚开始想当然以为类型二和那个问题一样,结果后来仔细一看这道题要比那道的操作步骤简单多了。
问题抽象化:我们将字符串设为[1...n],现在的问题是求出这个字符串的最少变更次数。而第一步操作可以描述为:从[1...n]中选取[1...k]附加到[k+1...n]后面,即[k+1...n,1...k],我们发现中间部位[k+1...n]是不变的,而只有[1...k]的整体变动,然而这[1...k]的变动对[1...k]的转换次数并不会产生影响,为什么呢?
首先,对于交替,我们有两种情况:[01.....],[10......]。
其次,[k+1...n]有上面两种情况,[1...k]也有上面两种情况,然而当[1...k]移到[k+1...n]之后时,[1...k]的交替情况就会受到[k+1...n]的影响,也就是产生笛卡尔积,变成四种情况了。
最后,假设[k+1...n]单个的反转次数分别为:n1,n2分别对应[01......],[10......],[1...k]单个的反转次数分别为:k1,k2。则二者组合可能产生的次数为:n1+k1, n1+k2, n2+k1, n2+k2
而两者组合反转次数最少的就是min(n1+k1, n1+k2, n2+k1, n2+k2)
我们只需将每个元素遍历一次即可得到整个字符串的最小反转次数。
三、代码实现:
var minFlips = function(s) {
let len = s.length;
let mixs = new Array(len);
//mixs.fill([0,0]);
//注意这里用fill这样会导致之后的每个用指针,所以后面直接每个item赋值数组
let state = ['0','1'];
mixs[-1] = [0,0];
for(let i = 0; i < len; i++) {
mixs[i] = [];
if(i % 2 == 0) {
if(s[i] != state[0]) {
mixs[i][0] = mixs[i-1][0] + 1;
} else {
mixs[i][0] = mixs[i-1][0];
}
if(s[i] != state[1]) {
mixs[i][1] = mixs[i-1][1] + 1;
} else {
mixs[i][1] = mixs[i-1][1];
}
} else {
if(s[i] != state[1]) {
mixs[i][0] = mixs[i-1][0] + 1;
} else {
mixs[i][0] = mixs[i-1][0];
}
if(s[i] != state[0]) {
mixs[i][1] = mixs[i-1][1] + 1;
} else {
mixs[i][1] = mixs[i-1][1];
}
}
}
let minv = Infinity;
let total = mixs[len-1];
for(let j = 0; j < len; j++) {
//以j为多少开始
let t0 = 0;
let t1 = 0;
if(j % 2 == 0) {
t0 = total[0] - mixs[j-1][0];
t1 = total[1] - mixs[j-1][1];
if((len-j) % 2 == 0) {
t0 += mixs[j-1][0];
t1 += mixs[j-1][1];
} else {
t0 += mixs[j-1][1];
t1 += mixs[j-1][0];
}
} else {
t0 = total[1] - mixs[j-1][1];
t1 = total[0] - mixs[j-1][0];
if((len-j) % 2 == 0) {
t0 += mixs[j-1][0];
t1 += mixs[j-1][1];
} else {
t0 += mixs[j-1][1];
t1 += mixs[j-1][0];
}
}
t0 = Math.min(t0, total[0]);
t1 = Math.min(t1, total[1]);
minv = Math.min(minv, Math.min(t0, t1));
}
return minv;
};
标签:mixs,...,二进制,t0,t1,let,字符,字符串,else 来源: https://blog.csdn.net/wweTHEUT/article/details/117793025
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。