关注
我把这个算法称为找♂0算法,从定义出发的思路:
1:MAX情况,FFFF是最大的二进制数
2:对于任何一个二进制数,比较大小的条件:
a) 如果所有位都相等,那么两个数相等
b) 从左向右两个数间第一个不同的位中,是1的那个数更大
所以,对于两个不同的数,只要最高不同位是1,那么后面的数是多少都无所谓。
因此对数组从左到右循环,找到第一个为0的位,努力让这个位变成1,变成1的方法是:看这个位的后一位是否是0,如果是0则00->10变化成功,如果是1则再看1后是不是0,如果是0则010->001->101变化成功,以此类推,当访问到末尾时还找不到能提供0的对,那么算法无能为力,可以返回了。
以下是pseudocode
bool move(int arr[],int start,int size){
if(start==size) false;
if(arr[start+1]!=0){
move(arr,start+1,size);
}
if(arr[start+1]==0){
arr[start]=!arr[start];
arr[start+1]=!arr[start+1];
return true;
}else return false;
function solution(int arr[],int size)->int []{
for(int i=0;i<size;i++){
if(arr[i]==0){
if(!move(arr,i,size)) break;
}
}
return arr;
}
复杂度分析,最好情况n个0,O(n)遍历得到n-1个1+0,最坏情况0+n-2个1+0->n-2个1+01复杂度是O(n2)
查看原帖
1 评论
相关推荐
点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 面试问题记录 #
19659次浏览 337人参与
# 硬件人你反向读研了吗 #
39892次浏览 608人参与
# 京东TGT #
27571次浏览 151人参与
# 硬件人秋招的第一个offer #
65674次浏览 1081人参与
# 滴滴工作体验 #
23367次浏览 123人参与
# 非技术岗投递进展 #
137551次浏览 1222人参与
# 材料进Fab厂真的劝退吗? #
36179次浏览 158人参与
# 不考虑转正,实习多久合适 #
24198次浏览 118人参与
# 机械求职避坑tips #
41147次浏览 355人参与
# 互联网回暖,腾讯要招5000+人! #
263528次浏览 4889人参与
# 面试经验谈 #
12693次浏览 190人参与
# 机械只有转码才有出路吗? #
125882次浏览 1590人参与
# 职场新人生存指南 #
332455次浏览 7135人参与
# 面试吐槽bot #
2539次浏览 31人参与
# 异地恋该为对方跳槽吗 #
23490次浏览 119人参与
# 硬件人更看重稳定还是高薪 #
38656次浏览 203人参与
# vivo求职进展汇总 #
208612次浏览 1341人参与
# 25届如何提前做秋招准备? #
163927次浏览 2451人参与
# 你遇到过哪些神仙同事 #
69454次浏览 623人参与
# 租房找室友 #
27637次浏览 144人参与
# 深信服求职进展汇总 #
188756次浏览 1694人参与