2026-04-04最少翻转次数得到反转二进制字符串。用go语言给定一个正整数 n。把 n 转成二进制字符串记为 s要求不带前导零。定义“反转字符串”把 s 的所有字符顺序倒过来形成的新字符串记为 rev(s)。你可以在字符串 s 中选择任意一个位置把该位置上的位进行翻转把 0 改成 1或把 1 改成 0。每次翻转只改变一个位置上的字符。目标通过若干次这样的单点翻转使得当前的二进制字符串恰好等于它自己的反转也就是把 s 变成 rev(s)。问达到上述目标所需的最少翻转次数是多少。1 n 1000000000。输入 n 10。输出 4。解释10 的二进制表示为 “1010”。其反转为 “0101”。必须翻转所有四位才能使它们相等。因此所需的最少翻转次数为 4。题目来自力扣3750。代码执行过程分步详细描述以输入n10为例我们先明确核心需求将数字的二进制字符串变成回文自身反转后和自己相同求最少翻转0/1的次数核心逻辑是二进制原串和反转串对应位不同的数量就是最少翻转次数。下面分步骤拆解完整过程步骤1接收输入的正整数程序主函数中输入数字10将其传入计算函数minimumFlips。步骤2将整数转换为无符号整数方便位运算把输入的有符号整数10转换为无符号整数目的是让Go语言的位运算工具能安全处理二进制位避免符号位干扰。输入数字10转换后无符号数10二进制无变化步骤3获取数字的纯二进制字符串无前置零数字10的标准二进制是1010这是核心处理的字符串满足题目要求不带前导零。二进制长度4位二进制串1 0 1 0步骤4计算二进制串的反转字符串对应的数字这一步是代码的核心操作先对原数字的所有二进制位进行完全反转包含高位的0再剔除反转后多余的前导零得到原二进制串反转后的纯数字。原二进制串1010反转后的二进制串0101对应数字5步骤5计算原二进制和反转二进制的异或结果异或运算规则相同位为0不同位为1。这个运算能直接标记出「原串和反转串不一样的位置」。原二进制1 0 1 0反转二进制0 1 0 1异或结果1 1 1 1所有位都不相同步骤6统计异或结果中1的个数异或结果里的每一个1都代表需要翻转1次。统计1的数量就是最少翻转次数。异或结果11111的个数4最终结果4通用逻辑总结所有数字都适用把输入数字转成无前置零的二进制字符串生成这个二进制串的反转字符串逐位对比原串和反转串统计不相同的位的数量不相同的位的数量就是最少需要翻转的次数。时间复杂度 额外空间复杂度1. 时间复杂度代码中所有操作都是针对固定长度的二进制位题目中n≤10亿二进制最多30位位反转、剔除前导零、异或、统计1的个数都是常数次操作与输入数字的大小无关。总时间复杂度O(1)常数级2. 额外空间复杂度程序执行过程中只定义了少量变量存储原数、反转数、异或结果等没有使用数组、切片、哈希表等动态扩容的数据结构占用的内存空间固定不随输入变化。总额外空间复杂度O(1)常数级总结核心逻辑二进制原串和反转串的不同位数量 最少翻转次数执行效率时间和空间都是常数级O(1)能高效处理题目要求的最大输入值。Go完整代码如下packagemainimport(fmtmath/bits)funcminimumFlips(numint)int{n:uint(num)rev:bits.Reverse(n)bits.LeadingZeros(n)returnbits.OnesCount(n^rev)}funcmain(){n:10result:minimumFlips(n)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defminimum_flips(num:int)-int:nnum# Get binary representation without 0b prefixbinarybin(n)[2:]bit_lengthlen(binary)# Reverse the bitsrevint(binary[::-1],2)# Count differing bitsreturnbin(n^rev).count(1)defmain():n10resultminimum_flips(n)print(result)if__name____main__:main()C完整代码如下#includeiostream#includebitset#includealgorithm#includestringintminimumFlips(intnum){if(num0)return1;// Special case: flipping 0 to itself? Actually returns 0// Convert to binary stringstd::string binarystd::bitset32(num).to_string();// Trim leading zerosbinarybinary.substr(binary.find(1));// Reverse the stringstd::string reversedbinary;std::reverse(reversed.begin(),reversed.end());// Convert back to integerintrev_numstd::stoi(reversed,nullptr,2);// Count differing bitsintxor_resultnum^rev_num;returnstd::popcount(static_castunsignedint(xor_result));}intmain(){intn10;intresultminimumFlips(n);std::coutresultstd::endl;return0;}