1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-01-11 02:58:13 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
leetcode-problemset/leetcode-cn/problem (Chinese)/数组元素的最小非零乘积 [minimum-non-zero-product-of-the-array-elements].html
2022-03-29 12:43:11 +08:00

55 lines
2.5 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<p>给你一个正整数&nbsp;<code>p</code>&nbsp;。你有一个下标从 <strong>1</strong>&nbsp;开始的数组&nbsp;<code>nums</code>&nbsp;,这个数组包含范围&nbsp;<code>[1, 2<sup>p</sup> - 1]</code>&nbsp;内所有整数的二进制形式(两端都 <strong>包含</strong>)。你可以进行以下操作 <strong>任意</strong>&nbsp;次:</p>
<ul>
<li><code>nums</code>&nbsp;中选择两个元素&nbsp;<code>x</code>&nbsp;&nbsp;<code>y</code>&nbsp;</li>
<li>选择 <code>x</code>&nbsp;中的一位与 <code>y</code>&nbsp;对应位置的位交换。对应位置指的是两个整数 <strong>相同位置</strong>&nbsp;的二进制位。</li>
</ul>
<p>比方说,如果&nbsp;<code>x = 11<em><strong>0</strong></em>1</code>&nbsp;&nbsp;<code>y = 00<em><strong>1</strong></em>1</code>&nbsp;,交换右边数起第 <code>2</code>&nbsp;位后,我们得到&nbsp;<code>x = 11<em><strong>1</strong></em>1</code>&nbsp;<code>y = 00<em><strong>0</strong></em>1</code>&nbsp;</p>
<p>请你算出进行以上操作 <strong>任意次</strong>&nbsp;以后,<code>nums</code>&nbsp;能得到的 <strong>最小非零</strong>&nbsp;乘积。将乘积对<em>&nbsp;</em><code>10<sup>9</sup> + 7</code>&nbsp;<strong>取余</strong> 后返回。</p>
<p><strong>注意:</strong>答案应为取余 <strong>之前</strong>&nbsp;的最小值。</p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<b>输入:</b>p = 1
<b>输出:</b>1
<b>解释:</b>nums = [1] 。
只有一个元素,所以乘积为该元素。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<b>输入:</b>p = 2
<b>输出:</b>6
<b>解释:</b>nums = [01, 10, 11] 。
所有交换要么使乘积变为 0 ,要么乘积与初始乘积相同。
所以,数组乘积 1 * 2 * 3 = 6 已经是最小值。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<b>输入:</b>p = 3
<b>输出:</b>1512
<b>解释:</b>nums = [001, 010, 011, 100, 101, 110, 111]
- 第一次操作中,我们交换第二个和第五个元素最左边的数位。
- 结果数组为 [001, <em><strong>1</strong></em>10, 011, 100, <em><strong>0</strong></em>01, 110, 111] 。
- 第二次操作中,我们交换第三个和第四个元素中间的数位。
- 结果数组为 [001, 110, 0<em><strong>0</strong></em>1, 1<em><strong>1</strong></em>0, 001, 110, 111] 。
数组乘积 1 * 6 * 1 * 6 * 1 * 6 * 7 = 1512 是最小乘积。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= p &lt;= 60</code></li>
</ul>