Skip to main content

2864 - Maximum Odd Binary Number (Easy)

https://leetcode.com/problems/maximum-odd-binary-number/

Problem Statement

You are given a binary string s that contains at least one '1'.

You have to rearrange the bits in such a way that the resulting binary number is the maximum odd binary number that can be created from this combination.

Return a string representing the maximum odd binary number that can be created from the given combination.

Notethat the resulting string can have leading zeros.

Example 1:

Input: s = "010"
Output: "001"
Explanation: Because there is just one '1', it must be in the last position. So the answer is "001".

Example 2:

Input: s = "0101"
Output: "1001"
Explanation: One of the '1's must be in the last position. The maximum number that can be made with the remaining digits is "100". So the answer is "1001".

Constraints:

  • 1 <= s.length <= 100
  • s consists only of '0' and '1'.
  • s contains at least one '1'.

Approach 1: Count and create a new string

This is the simplest approach. We count the number of '1's and stich together a new string as answer.

Let nn be the length of the input string, then the

  • Time complexity is O(n)O(n) as we need to scan the input and then stich together the input, to be fair I need to research of stiching the string together here will actually yield a O(n)O(n) solution, let me know if you have thoughts on this. The

  • Space comlexity is O(n)O(n), if we count the size of the output.

Written by @header
string maximumOddBinaryNumber(const string& s) {
const int ones = count(begin(s), end(s), '1');
return string(ones - 1, '1') + string(size(s) - ones, '0') + "1";
}

Approach 2: Count and rewrite in-place

This is like approach 1, but instead of creating a new string, we are rewriting it in-place.

Let nn be the length of the input string, then the

  • Time complexity is O(n)O(n) as we need to scan the input and rewrite it, and the

  • Space comlexity is O(1)O(1).

Written by @heder
string maximumOddBinaryNumber(string& s) {
const int ones = count(begin(s), end(s), '1');
int w = 0;
for (; w < ones - 1; ++w) s[w] = '1';
for (; w + 1 < size(s); ++w) s[w] = '0';
s[w] = '1';
return s;
}

Approach 3: Partation and swap the last 1 in place

We are writing the string in place in a single pass, all that's left to do after std::partition is to swap the last '1' to the last position.

  • Time complexity is O(n)O(n) as we need to scan the input and rewrite it, and the

  • Space comlexity is O(1)O(1).

Written by @heder
string maximumOddBinaryNumber(string& s) {
auto it = partition(begin(s), end(s), [](char ch) { return ch == '1'; });
iter_swap(prev(it), prev(end(s)));
return s;
}