869. 重新排序得到 2 的幂

🔢 判断数字能否重排成 2 的幂 —— LeetCode「重排得到 2 的幂」题解

📌 题目描述

给定一个正整数 n,我们可以重新排列它的每一位数字(包括原始顺序),但不允许有前导零。我们想知道是否存在这样一种排列,使得该数字是 2 的幂次方

输入:
n = 1
输出:
True

输入:
n = 10
输出:
False

限制:

  • 1 <= n <= 10⁹

🧠 解题思路分析

这是一个典型的数字重排 + 模式匹配问题。我们需要在所有 n 的排列中,判断是否有哪一个排列对应的是 2 的幂

❓ 怎么判断一个数是 2 的幂?

我们可以预先知道,2 的幂在 10⁹ 范围内只有有限的几种情况:

  • 2^0 = 1
  • 2^1 = 2
在C语言中,将一组数字重新排列成2序列通常涉及到一种叫做“二进制拆分”的算法。这个过程可以分为两个步骤: 1. **计算目标**:首先确定需要生成的最大2,这通常是数组中最大元素的一半,向下取整。例如,如果数组包含[4, 8, 16],那么最大2是16。 2. **二进制拆分**:对于每个数组元素,将其右移直到它变为2,记录下每次移动的位置。比如,4变成2的过程需要向左移一位,8已经是2^3,无需移动,16已经是2^4。这样,我们就能得到一个位置数组,如[1, 0, 3]。 然后,为了得到实际的2序列,我们可以从大到小遍历位置数组,并相应地调整原数组中的元素,使其顺序对应于二进制位。例如,如果位置数组是[3, 1, 0],则最终序列可能是[16, 4, 8](因为2^3 > 2^1 > 2^0)。 这是一个简单的示例代码片段,用于演示如何在C语言中实现这个过程: ```c #include <stdio.h> // Function to find the next power of 2 greater than or equal to n int nextPowerOfTwo(int n) { return 1 << (n - 1 & ~n); } void rearrangeToPowersOfTwo(int arr[], int n) { int target = nextPowerOfTwo(arr[n-1]); int pos[32]; // Assuming we have at most 32 elements in the array memset(pos, 0, sizeof(pos)); for (int i = 0; i < n; ++i) { while (arr[i] < target) { arr[i] <<= 1; if (pos[arr[i] - 1]) break; // If a larger power is already set, skip it pos[arr[i] - 1] = i; } } // Print the rearranged array for (int i = 0; i < n; ++i) { printf("%d ", arr[i]); } } int main() { int arr[] = {4, 8, 16}; int n = sizeof(arr) / sizeof(arr[0]); rearrangeToPowersOfTwo(arr, n); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值