Mario大叔叔👨 level
获赞
5
粉丝
0
关注
1
看过 TA
0
华南理工大学
2021
C++
IP属地:未知
暂未填写个人简介
私信
关注
2020-04-09 01:22
华南理工大学 C++
输入一个0和1的整型串代表二进制 其中: 任意的00可以转化为10 任意的10可以转化为01 输出转化之后,最大的二进制。 个人想法: 观察转换的两种规则, 第一个是转换规则,连续的两个0能变大,延伸为所有连续的0000可以转化为1110(只有最后有一个0) 第二个是转移规则,0只能左移,1只能右移 因此, 随便一个序列110010100111010(15个,7个0,8个1) 从第一个0开始,后面的0都转移第一个0的后面,得到110000000111111 再通...
hurley:我把这个算法称为找♂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)
投递华为等公司10个岗位 >
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务