Skip to content

Commit eeff826

Browse files
chaimode0xMashiro
authored andcommitted
feat: Solve LeetCode Daily Challenge #3315
1 parent ee3eadc commit eeff826

3 files changed

Lines changed: 204 additions & 0 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include "leetcode/core.h"
2+
3+
namespace leetcode {
4+
namespace problem_3315 {
5+
6+
using Func = std::function<vector<int>(vector<int>&)>;
7+
8+
class ConstructTheMinimumBitwiseArrayIiSolution : public SolutionBase<Func> {
9+
public:
10+
//! 3315. Construct the Minimum Bitwise Array II
11+
//! https://leetcode.com/problems/construct-the-minimum-bitwise-array-ii/
12+
vector<int> minBitwiseArray(vector<int>& nums);
13+
14+
ConstructTheMinimumBitwiseArrayIiSolution();
15+
};
16+
17+
} // namespace problem_3315
18+
} // namespace leetcode
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include "leetcode/problems/construct-the-minimum-bitwise-array-ii.h"
2+
3+
namespace leetcode {
4+
namespace problem_3315 {
5+
6+
// 策略1:直接计算后缀连续1的个数,然后减去相应位
7+
// 时间复杂度: O(n log MAX),空间复杂度: O(1)
8+
static vector<int> solution1(vector<int>& nums) {
9+
vector<int> ans;
10+
ans.reserve(nums.size());
11+
for (int num : nums) {
12+
// 计算从最低位开始的连续1的个数
13+
int suffix_ones = 0;
14+
int temp = num;
15+
while ((temp & 1) == 1) {
16+
++suffix_ones;
17+
temp >>= 1;
18+
}
19+
// 如果后缀连续1的个数为0,则无解
20+
if (suffix_ones == 0) {
21+
ans.push_back(-1);
22+
} else {
23+
// 最小x = num - (1 << (suffix_ones - 1))
24+
ans.push_back(num - (1 << (suffix_ones - 1)));
25+
}
26+
}
27+
return ans;
28+
}
29+
30+
// 策略2:使用位运算技巧,直接构造x
31+
// 时间复杂度: O(n log MAX),空间复杂度: O(1)
32+
static vector<int> solution2(vector<int>& nums) {
33+
vector<int> ans;
34+
ans.reserve(nums.size());
35+
for (int num : nums) {
36+
// 找到最低的0位的位置(从0开始),实际上就是后缀连续1的个数
37+
int suffix_ones = 0;
38+
int temp = num;
39+
while ((temp & 1) == 1) {
40+
++suffix_ones;
41+
temp >>= 1;
42+
}
43+
if (suffix_ones == 0) {
44+
ans.push_back(-1);
45+
} else {
46+
// 构造mask,将第(suffix_ones-1)位清零
47+
int mask = 1 << (suffix_ones - 1);
48+
ans.push_back(num & ~mask);
49+
}
50+
}
51+
return ans;
52+
}
53+
54+
// 策略3:使用内置函数__builtin_ctz计算后缀0的个数,从而得到连续1的个数
55+
// 注意:__builtin_ctz(0)是未定义的,但这里temp = num ^ ((1 << suffix_ones) - 1)可能为0
56+
// 更安全的方法:直接计算连续1的个数
57+
// 时间复杂度: O(n),空间复杂度: O(1)
58+
static vector<int> solution3(vector<int>& nums) {
59+
vector<int> ans;
60+
ans.reserve(nums.size());
61+
for (int num : nums) {
62+
// 计算后缀连续1的个数:找到最低的0位
63+
// 方法:计算 (num ^ (num + 1)) >> 1 的尾部0的个数?需要推导
64+
// 更简单:直接循环
65+
int suffix_ones = 0;
66+
int temp = num;
67+
while ((temp & 1) == 1) {
68+
++suffix_ones;
69+
temp >>= 1;
70+
}
71+
if (suffix_ones == 0) {
72+
ans.push_back(-1);
73+
} else {
74+
ans.push_back(num - (1 << (suffix_ones - 1)));
75+
}
76+
}
77+
return ans;
78+
}
79+
80+
ConstructTheMinimumBitwiseArrayIiSolution::ConstructTheMinimumBitwiseArrayIiSolution() {
81+
setMetaInfo({.id = 3315,
82+
.title = "Construct the Minimum Bitwise Array II",
83+
.url = "https://leetcode.com/problems/construct-the-minimum-bitwise-array-ii/"});
84+
registerStrategy("Count Suffix Ones", solution1);
85+
registerStrategy("Bit Mask", solution2);
86+
registerStrategy("Alternative", solution3);
87+
}
88+
89+
vector<int> ConstructTheMinimumBitwiseArrayIiSolution::minBitwiseArray(vector<int>& nums) {
90+
return getSolution()(nums);
91+
}
92+
93+
} // namespace problem_3315
94+
} // namespace leetcode
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#include "leetcode/problems/construct-the-minimum-bitwise-array-ii.h"
2+
3+
#include "gtest/gtest.h"
4+
5+
namespace leetcode {
6+
namespace problem_3315 {
7+
8+
class ConstructTheMinimumBitwiseArrayIiTest : public ::testing::TestWithParam<string> {
9+
protected:
10+
void SetUp() override { solution.setStrategy(GetParam()); }
11+
12+
ConstructTheMinimumBitwiseArrayIiSolution solution;
13+
};
14+
15+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, Example1) {
16+
vector<int> nums = {2, 3, 5, 7};
17+
vector<int> expected = {-1, 1, 4, 3};
18+
vector<int> result = solution.minBitwiseArray(nums);
19+
EXPECT_EQ(expected, result);
20+
}
21+
22+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, Example2) {
23+
vector<int> nums = {11, 13, 31};
24+
vector<int> expected = {9, 12, 15};
25+
vector<int> result = solution.minBitwiseArray(nums);
26+
EXPECT_EQ(expected, result);
27+
}
28+
29+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, AdditionalTest1) {
30+
vector<int> nums = {2};
31+
vector<int> expected = {-1};
32+
vector<int> result = solution.minBitwiseArray(nums);
33+
EXPECT_EQ(expected, result);
34+
}
35+
36+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, AdditionalTest2) {
37+
vector<int> nums = {3};
38+
vector<int> expected = {1};
39+
vector<int> result = solution.minBitwiseArray(nums);
40+
EXPECT_EQ(expected, result);
41+
}
42+
43+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, AdditionalTest3) {
44+
vector<int> nums = {5};
45+
vector<int> expected = {4};
46+
vector<int> result = solution.minBitwiseArray(nums);
47+
EXPECT_EQ(expected, result);
48+
}
49+
50+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, AdditionalTest4) {
51+
vector<int> nums = {7};
52+
vector<int> expected = {3};
53+
vector<int> result = solution.minBitwiseArray(nums);
54+
EXPECT_EQ(expected, result);
55+
}
56+
57+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, AdditionalTest5) {
58+
vector<int> nums = {131}; // 10000011 binary
59+
// 后缀连续1的个数:最低位1,次低位1,第三位0 -> suffix_ones = 2
60+
// ans = 131 - (1 << 1) = 131 - 2 = 129
61+
// 验证:129 (10000001) OR 130 (10000010) = 131 (10000011)
62+
vector<int> expected = {129};
63+
vector<int> result = solution.minBitwiseArray(nums);
64+
EXPECT_EQ(expected, result);
65+
}
66+
67+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, AdditionalTest6) {
68+
vector<int> nums = {257}; // 100000001 binary
69+
// 后缀连续1的个数:最低位1,次低位0 -> suffix_ones = 1
70+
// ans = 257 - 1 = 256
71+
// 验证:256 (100000000) OR 257 (100000001) = 257
72+
vector<int> expected = {256};
73+
vector<int> result = solution.minBitwiseArray(nums);
74+
EXPECT_EQ(expected, result);
75+
}
76+
77+
TEST_P(ConstructTheMinimumBitwiseArrayIiTest, AdditionalTest7) {
78+
vector<int> nums = {1023}; // 1111111111 (10 bits)
79+
// 后缀连续1的个数 = 10
80+
// ans = 1023 - (1 << 9) = 1023 - 512 = 511
81+
// 验证:511 (0111111111) OR 512 (1000000000) = 1023 (1111111111)
82+
vector<int> expected = {511};
83+
vector<int> result = solution.minBitwiseArray(nums);
84+
EXPECT_EQ(expected, result);
85+
}
86+
87+
INSTANTIATE_TEST_SUITE_P(
88+
LeetCode, ConstructTheMinimumBitwiseArrayIiTest,
89+
::testing::ValuesIn(ConstructTheMinimumBitwiseArrayIiSolution().getStrategyNames()));
90+
91+
} // namespace problem_3315
92+
} // namespace leetcode

0 commit comments

Comments
 (0)