逐位二进制拼接 → 翻转 → 去头零 → 消邻重

题目描述

给你一个非负整数 nn,按照下面的步骤操作,输出最终的二进制字符串。

操作步骤

  1. 逐位转二进制(最少位数)

    把 nn 的每一位十进制数字分别转成二进制,并且 去掉前导 0

    特殊地,数字 0 转成字符串 "0"

    示例:

    • 数字 5 → "101"

    • 数字 0 → "0"

    • 数字 9 → "1001"

  2. 拼接二进制串

    按原数字从左到右的顺序,把上一步的结果拼接成一个长二进制串 SS。

    示例:数字 1 3 4 → "1" + "11" + "100" = "111100"

  3. 整体反转

    将 SS 反转,得到 S′S′。

    示例:"111100""001111"

  4. 删除前导零

    删除 S′S′ 最前面的所有连续 '0',得到 S′′S′′。

    如果 S′S′ 全是零,则 S′′S′′ 为空串。

    示例:"001111""1111"

  5. 相邻去重(非连续保留一个)

    从左到右扫描 S′′S′′,如果当前字符和前一个字符相同,就删掉当前字符,否则保留。

    示例:

    • "1111""1"

    • "110011""101"

  6. 输出结果

Java

java 复制代码
import java.util.*;

class Solution {
    private String numToBinary (int digit) {
        if (digit == 0) {
            return "0";
        }
        StringBuilder binary = new StringBuilder();
        int num = digit;
        
        while (num > 0) {
            binary.insert(0, num % 2);
            num /= 2;
        }
        
        return binary.toString();
    }
    
    public String processNum (int num) {
        if (num == 0) {
            return "";
        }
        
        // 最少位二进制数表示
        String numStr = String.valueOf(num);
        StringBuilder binaryA = new StringBuilder();
        for (int i=0; i<numStr.length(); i++) {
            int digit = numStr.charAt(i) - '0';
            binaryA.append(numToBinary(digit));
        }
        
        // 翻转字符串并去除头部0
        String reversedA = binaryA.reverse().toString();
        int startindex = 0;
        while (startindex < reversedA.length() && reversedA.charAt(startindex) == '0') {
            startindex ++;
        }
        if (startindex == reversedA.length()) {
            return "";
        }
        String binaryB = reversedA.substring(startindex);
        
        // 去除相邻重复
        StringBuilder result = new StringBuilder();
        result.append(binaryB.charAt(0));
        
        for (int i=1; i<binaryB.length(); i++) {
            if (binaryB.charAt(i) != binaryB.charAt(i-1)) {
                result.append(binaryB.charAt(i));
            }
        }
        
        return result.toString();
    }
}


public class Main {
	public static void main(String[] args) {
	    Solution solu = new Solution();
	    
		int[] nums = {34,156,981};
		
		for (int num : nums) {
		    System.out.println(num + " -> " + solu.processNum(num));
		}
	}
}

Python

python 复制代码
def process_number(n: int) -> str:
    if n == 0:
        return ""
    
    # 步骤1: 将每一位十进制数字转换为最少位数的二进制表示
    num_str = str(n)
    binary_parts = []
    
    for ch in num_str:
        digit = int(ch)
        if digit == 0:
            binary_parts.append("0")
        else:
            # 转换为二进制并去掉前缀'0b'
            binary_parts.append(bin(digit)[2:])
    
    # 步骤2: 拼接所有二进制串
    concatenated = "".join(binary_parts)
    
    # 步骤3: 反转整个字符串
    reversed_str = concatenated[::-1]
    
    # 步骤4: 去除前导零
    # lstrip('0') 会删除字符串开头的所有'0'
    without_leading_zeros = reversed_str.lstrip('0')
    
    # 如果全部是0,lstrip后会是空字符串
    if not without_leading_zeros:
        return ""
    
    # 步骤5: 去除相邻重复的数字
    result = []
    result.append(without_leading_zeros[0])
    
    for i in range(1, len(without_leading_zeros)):
        if without_leading_zeros[i] != without_leading_zeros[i - 1]:
            result.append(without_leading_zeros[i])
    
    return "".join(result)
相关推荐
变量未定义~1 小时前
单点修改、区间求和(模板)、区间修改,单点查询(模板)
数据结构·算法
weixin_468466851 小时前
SURF 图像特征提取算法新手实战指南
图像处理·人工智能·算法·机器视觉·surf·sift
weixin_468466852 小时前
支持向量机新手实战指南
人工智能·python·算法·机器学习·支持向量机
weixin_468466853 小时前
机器学习之决策树新手实战指南
人工智能·python·算法·决策树·机器学习·ai
wanghu20243 小时前
ABC460_E题题解
c++·算法
z200509303 小时前
今日算法(回溯子集)
数据结构·算法·leetcode
Hesionberger3 小时前
巧用异或找出唯一数字(多解)
java·数据结构·python·算法·leetcode
变量未定义~3 小时前
阶乘的约数和、斐波那契数列、数列区间最大值(ST表)
数据结构·算法
智者知已应修善业3 小时前
【51单片机象棋快棋赛 电子裁判器】2023-12-27
c++·经验分享·笔记·算法·51单片机