寻找最小的比b大的二进制数y
给出一个二进制数x(字符串),求一个最小的比x大的二进制数y,并且y要满足只有k个位置上是1,其他位置都是0。
public static void searchMinNum(String b,int k){
//num1为字符串中1的个数
int num1 = 0;
//flag为是否在字符串中找到了k个1
boolean flag = false;
//ad为第k个1在字符串中的下标
int ad = 0;
for (int i = 0; i < b.length(); i++) {
if (b.charAt(i)=='1'){
num1++;
}
if(num1==k){
flag = true;
ad = i;
break;
}
}
StringBuilder res = new StringBuilder();
//在字符串中没找到足够的1
if(!flag){
//字符串长度小于等于k
//例如:111 4
if(b.length()<=k){
for (int i = 0; i < k; i++) {
res.append(1);
}
}else{
//字符串长度大于k,从后面将0改为1
//例如:10001 4
for (int i = b.length()-1; i >= 0; i--) {
if(num1<k){
if(b.charAt(i)!='1'){
num1++;
}
res.append(1);
}else{
res.append(b.charAt(i));
}
}
}
System.out.println(res.reverse().toString());
}
//在字符串中找到了足够的1
else{
//字符串长度等于k且全是1
//例如:4 1111
if(ad == b.length()-1&&k==b.length()){
for (int i = 0; i < k-1; i++) {
res.append(1);
}
res.append(0);
res.append(1);
System.out.println(res.reverse().toString());
}
//字符串长度大于k且在第k个1的前一位为0
//例如:4 101101
else if(b.charAt(ad-1)=='0'){
for (int i = 0; i < b.length(); i++) {
if(i == ad-1){
res.append(1);
}else if(i == ad){
res.append(0);
}else if(i < ad){
res.append(b.charAt(i));
}else{
res.append(0);
}
}
System.out.println(res.toString());
}else{
//have0为第k个1前面是否有0存在
boolean have0 = false;
for(int i = ad;i >= 0;i--){
if(b.charAt(i)=='0'){
have0 = true;
ad = i;
break;
}
}
//第k个1前面存在0
// 例如:3 10110
if(have0){
for(int i = 0;i < b.length();i++){
if(i < ad){
res.append(b.charAt(i));
}else if(i == ad){
res.append(1);
}else if(i == b.length()-1){
res.append(1);
}else{
res.append(0);
}
}
System.out.println(res.toString());
}else{
//第k个1前面不存在0
//例如:4 11101
res.append(1);
num1--;
for (int i = 0; i < b.length() - num1; i++) {
res.append(0);
}
for (int i = 0; i < num1; i++) {
res.append(1);
}
System.out.println(res.toString());
}
}
}
}