3750. 最少翻转次数得到反转二进制字符串

March 11, 2026 · View on GitHub

English Version

题目描述

给你一个 整数 n

sn二进制表示(不含前导零)。

二进制字符串 s反转 是指将 s 中的字符按相反顺序排列得到的字符串。

你可以翻转 s 中的任意一位(将 0 → 11 → 0)。每次翻转 影响一位。

请返回使 s 等于其原始形式的反转所需的 最少 翻转次数。

 

示例 1:

输入: n = 7

输出: 0

解释:

7 的二进制表示为 "111"。其反转也是 "111",两者相同。因此,不需要翻转。

示例 2:

输入: n = 10

输出: 4

解释:

10 的二进制表示为 "1010"。其反转为 "0101"。必须翻转所有四位才能使它们相等。因此,所需的最少翻转次数为 4。

 

提示:

  • 1 <= n <= 109

解法

方法一:模拟

我们首先将整数 nn 转换成二进制字符串 ss,然后我们使用双指针分别从字符串的两端向中间遍历,统计对应位置字符不同的个数 cntcnt。由于每次翻转只能影响一位,因此总的翻转次数为 cnt×2cnt \times 2

时间复杂度 O(logn)O(\log n),空间复杂度 O(logn)O(\log n),其中 nn 是输入的整数。

Python3

class Solution:
    def minimumFlips(self, n: int) -> int:
        s = bin(n)[2:]
        m = len(s)
        return sum(s[i] != s[m - i - 1] for i in range(m // 2)) * 2

Java

class Solution {
    public int minimumFlips(int n) {
        String s = Integer.toBinaryString(n);
        int m = s.length();
        int cnt = 0;
        for (int i = 0; i < m / 2; i++) {
            if (s.charAt(i) != s.charAt(m - i - 1)) {
                cnt++;
            }
        }
        return cnt * 2;
    }
}

C++

class Solution {
public:
    int minimumFlips(int n) {
        vector<int> s;
        while (n > 0) {
            s.push_back(n & 1);
            n >>= 1;
        }

        int m = s.size();
        int cnt = 0;
        for (int i = 0; i < m / 2; i++) {
            if (s[i] != s[m - i - 1]) {
                cnt++;
            }
        }
        return cnt * 2;
    }
};

Go

func minimumFlips(n int) int {
    s := strconv.FormatInt(int64(n), 2)
    m := len(s)
    cnt := 0
    for i := 0; i < m/2; i++ {
        if s[i] != s[m-i-1] {
            cnt++
        }
    }
    return cnt * 2
}

TypeScript

function minimumFlips(n: number): number {
    const s = n.toString(2);
    const m = s.length;
    let cnt = 0;
    for (let i = 0; i < m / 2; i++) {
        if (s[i] !== s[m - i - 1]) {
            cnt++;
        }
    }
    return cnt * 2;
}