具有相同数量的 1 和 0 的下一个更大数字的二进制表示
给定一个表示正数 n 的二进制表示的二进制输入,找到大于 n 的最小数的二进制表示,其 1 和 0 的数量与 n 的二进制表示中的相同。如果无法形成这样的数字,则打印“没有更大的数字”。
二进制输入可能适合也可能不适合 unsigned long long int。
例子:
Input : 10010
Output : 10100
Here n = (18)10 = (10010)2
next greater = (20)10 = (10100)2
Binary representation of 20 contains same number of
1's and 0's as in 18.
Input : 111000011100111110
Output : 111000011101001111
这个问题简单地归结为找到给定字符串的下一个排列。我们可以找到输入二进制数的 next_permutation()。
下面是在二进制字符串中查找下一个排列的算法。
- 从右边开始遍历二进制字符串bstr 。
- 遍历时找到第一个索引i使得 bstr[i] = '0' 和 bstr[i+1] = '1'。
- 交换索引 'i' 和 'i+1' 处的字符。
- 由于我们需要最小的下一个值,因此考虑从索引i+2到 end 的子字符串,并将子字符串中的所有1移到最后。
下面是上述步骤的实现。
C++
// C++ program to find next permutation in a
// binary string.
#include
using namespace std;
// Function to find the next greater number
// with same number of 1's and 0's
string nextGreaterWithSameDigits(string bnum)
{
int l = bnum.size();
int i;
for (int i=l-2; i>=1; i--)
{
// locate first 'i' from end such that
// bnum[i]=='0' and bnum[i+1]=='1'
// swap these value and break;
if (bnum.at(i) == '0' &&
bnum.at(i+1) == '1')
{
char ch = bnum.at(i);
bnum.at(i) = bnum.at(i+1);
bnum.at(i+1) = ch;
break;
}
}
// if no swapping performed
if (i == 0)
"no greater number";
// Since we want the smallest next value,
// shift all 1's at the end in the binary
// substring starting from index 'i+2'
int j = i+2, k = l-1;
while (j < k)
{
if (bnum.at(j) == '1' && bnum.at(k) == '0')
{
char ch = bnum.at(j);
bnum.at(j) = bnum.at(k);
bnum.at(k) = ch;
j++;
k--;
}
// special case while swapping if '0'
// occurs then break
else if (bnum.at(i) == '0')
break;
else
j++;
}
// required next greater number
return bnum;
}
// Driver program to test above
int main()
{
string bnum = "10010";
cout << "Binary representation of next greater number = "
<< nextGreaterWithSameDigits(bnum);
return 0;
}
Java
// Java program to find next permutation in a
// binary string.
class GFG
{
// Function to find the next greater number
// with same number of 1's and 0's
static String nextGreaterWithSameDigits(char[] bnum)
{
int l = bnum.length;
int i;
for (i = l - 2; i >= 1; i--)
{
// locate first 'i' from end such that
// bnum[i]=='0' and bnum[i+1]=='1'
// swap these value and break;
if (bnum[i] == '0' &&
bnum[i+1] == '1')
{
char ch = bnum[i];
bnum[i] = bnum[i+1];
bnum[i+1] = ch;
break;
}
}
// if no swapping performed
if (i == 0)
System.out.println("no greater number");
// Since we want the smallest next value,
// shift all 1's at the end in the binary
// substring starting from index 'i+2'
int j = i + 2, k = l - 1;
while (j < k)
{
if (bnum[j] == '1' && bnum[k] == '0')
{
char ch = bnum[j];
bnum[j] = bnum[k];
bnum[k] = ch;
j++;
k--;
}
// special case while swapping if '0'
// occurs then break
else if (bnum[i] == '0')
break;
else
j++;
}
// required next greater number
return String.valueOf(bnum);
}
// Driver program to test above
public static void main(String[] args)
{
char[] bnum = "10010".toCharArray();
System.out.println("Binary representation of next greater number = "
+ nextGreaterWithSameDigits(bnum));
}
}
// This code contributed by Rajput-Ji
Python3
# Python3 program to find next permutation in a
# binary string.
# Function to find the next greater number
# with same number of 1's and 0's
def nextGreaterWithSameDigits(bnum):
l = len(bnum)
bnum = list(bnum)
for i in range(l - 2, 0, -1):
# locate first 'i' from end such that
# bnum[i]=='0' and bnum[i+1]=='1'
# swap these value and break
if (bnum[i] == '0' and bnum[i + 1] == '1'):
ch = bnum[i]
bnum[i] = bnum[i + 1]
bnum[i + 1] = ch
break
# if no swapping performed
if (i == 0):
return "no greater number"
# Since we want the smallest next value,
# shift all 1's at the end in the binary
# substring starting from index 'i+2'
j = i + 2
k = l - 1
while (j < k):
if (bnum[j] == '1' and bnum[k] == '0'):
ch = bnum[j]
bnum[j] = bnum[k]
bnum[k] = ch
j += 1
k -= 1
# special case while swapping if '0'
# occurs then break
else if (bnum[i] == '0'):
break
else:
j += 1
# required next greater number
return bnum
# Driver code
bnum = "10010"
print("Binary representation of next greater number = ",*nextGreaterWithSameDigits(bnum),sep="")
# This code is contributed by shubhamsingh10
C#
// C# program to find next permutation in a
// binary string.
using System;
class GFG
{
// Function to find the next greater number
// with same number of 1's and 0's
static String nextGreaterWithSameDigits(char[] bnum)
{
int l = bnum.Length;
int i;
for (i = l - 2; i >= 1; i--)
{
// locate first 'i' from end such that
// bnum[i]=='0' and bnum[i+1]=='1'
// swap these value and break;
if (bnum[i] == '0' &&
bnum[i+1] == '1')
{
char ch = bnum[i];
bnum[i] = bnum[i+1];
bnum[i+1] = ch;
break;
}
}
// if no swapping performed
if (i == 0)
Console.WriteLine("no greater number");
// Since we want the smallest next value,
// shift all 1's at the end in the binary
// substring starting from index 'i+2'
int j = i + 2, k = l - 1;
while (j < k)
{
if (bnum[j] == '1' && bnum[k] == '0')
{
char ch = bnum[j];
bnum[j] = bnum[k];
bnum[k] = ch;
j++;
k--;
}
// special case while swapping if '0'
// occurs then break
else if (bnum[i] == '0')
break;
else
j++;
}
// required next greater number
return String.Join("",bnum);
}
// Driver code
public static void Main(String[] args)
{
char[] bnum = "10010".ToCharArray();
Console.WriteLine("Binary representation of next greater number = "
+ nextGreaterWithSameDigits(bnum));
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
Binary representation of next greater number = 10100
时间复杂度: O(n),其中 n 是输入的位数。