Skip to content

Commit ffd2949

Browse files
committed
feat: add solutions to lc problem: No.1318
No.1318.Minimum Flips to Make a OR b Equal to c
1 parent 14161d1 commit ffd2949

File tree

7 files changed

+78
-101
lines changed

7 files changed

+78
-101
lines changed

solution/1300-1399/1318.Minimum Flips to Make a OR b Equal to c/README.md

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@
5050

5151
**方法一:位运算**
5252

53-
逐位提取 a, b, c 对应二进制位,进行比较计数。
53+
我们可以枚举 $a$, $b$, $c$ 的二进制表示的每一位,分别记为 $x$, $y$, $z$。如果 $x$ 和 $y$ 的按位或运算结果与 $z$ 不同,此时我们判断 $x$ 和 $y$ 是否都是 $1$,如果是,则需要翻转两次,否则只需要翻转一次。我们将所有需要翻转的次数累加即可。
54+
55+
时间复杂度 $O(\log M)$,空间复杂度 $O(1)$。其中 $M$ 是题目中数字的最大值。
5456

5557
<!-- tabs:start -->
5658

@@ -62,14 +64,10 @@
6264
class Solution:
6365
def minFlips(self, a: int, b: int, c: int) -> int:
6466
ans = 0
65-
for i in range(31):
66-
x, y, z = (a >> i) & 1, (b >> i) & 1, (c >> i) & 1
67-
if (x | y) == z:
68-
continue
69-
if x == 1 and y == 1 and z == 0:
70-
ans += 2
71-
else:
72-
ans += 1
67+
for i in range(30):
68+
x, y, z = a >> i & 1, b >> i & 1, c >> i & 1
69+
if x | y != z:
70+
ans += 2 if x == 1 and y == 1 else 1
7371
return ans
7472
```
7573

@@ -81,15 +79,11 @@ class Solution:
8179
class Solution {
8280
public int minFlips(int a, int b, int c) {
8381
int ans = 0;
84-
for (int i = 0; i < 31; ++i) {
85-
int x = (a >> i) & 1, y = (b >> i) & 1, z = (c >> i) & 1;
86-
if ((x | y) == z) {
87-
continue;
88-
}
89-
if (x == 1 && y == 1 && z == 0) {
90-
++ans;
82+
for (int i = 0; i < 30; ++i) {
83+
int x = a >> i & 1, y = b >> i & 1, z = c >> i & 1;
84+
if ((x | y) != z) {
85+
ans += x == 1 && y == 1 ? 2 : 1;
9186
}
92-
++ans;
9387
}
9488
return ans;
9589
}
@@ -103,11 +97,11 @@ class Solution {
10397
public:
10498
int minFlips(int a, int b, int c) {
10599
int ans = 0;
106-
for (int i = 0; i < 31; ++i) {
107-
int x = (a >> i) & 1, y = (b >> i) & 1, z = (c >> i) & 1;
108-
if ((x | y) == z) continue;
109-
if (x == 1 && y == 1 && z == 0) ++ans;
110-
++ans;
100+
for (int i = 0; i < 30; ++i) {
101+
int x = a >> i & 1, y = b >> i & 1, z = c >> i & 1;
102+
if ((x | y) != z) {
103+
ans += x == 1 && y == 1 ? 2 : 1;
104+
}
111105
}
112106
return ans;
113107
}
@@ -117,19 +111,18 @@ public:
117111
### **Go**
118112
119113
```go
120-
func minFlips(a int, b int, c int) int {
121-
ans := 0
122-
for i := 0; i < 31; i++ {
123-
x, y, z := (a>>i)&1, (b>>i)&1, (c>>i)&1
124-
if (x | y) == z {
125-
continue
126-
}
127-
if x == 1 && y == 1 && z == 0 {
128-
ans++
114+
func minFlips(a int, b int, c int) (ans int) {
115+
for i := 0; i < 30; i++ {
116+
x, y, z := a>>i&1, b>>i&1, c>>i&1
117+
if (x | y) != z {
118+
if x == 1 && y == 1 {
119+
ans += 2
120+
} else {
121+
ans++
122+
}
129123
}
130-
ans++
131124
}
132-
return ans
125+
return
133126
}
134127
```
135128

solution/1300-1399/1318.Minimum Flips to Make a OR b Equal to c/README_EN.md

Lines changed: 23 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,9 @@ Flip operation&nbsp;consists of change&nbsp;<strong>any</strong>&nbsp;single bit
4747
<p><strong>Constraints:</strong></p>
4848

4949
<ul>
50-
5150
<li><code>1 &lt;= a &lt;= 10^9</code></li>
52-
5351
<li><code>1 &lt;= b&nbsp;&lt;= 10^9</code></li>
54-
5552
<li><code>1 &lt;= c&nbsp;&lt;= 10^9</code></li>
56-
5753
</ul>
5854

5955
## Solutions
@@ -66,14 +62,10 @@ Flip operation&nbsp;consists of change&nbsp;<strong>any</strong>&nbsp;single bit
6662
class Solution:
6763
def minFlips(self, a: int, b: int, c: int) -> int:
6864
ans = 0
69-
for i in range(31):
70-
x, y, z = (a >> i) & 1, (b >> i) & 1, (c >> i) & 1
71-
if (x | y) == z:
72-
continue
73-
if x == 1 and y == 1 and z == 0:
74-
ans += 2
75-
else:
76-
ans += 1
65+
for i in range(30):
66+
x, y, z = a >> i & 1, b >> i & 1, c >> i & 1
67+
if x | y != z:
68+
ans += 2 if x == 1 and y == 1 else 1
7769
return ans
7870
```
7971

@@ -83,15 +75,11 @@ class Solution:
8375
class Solution {
8476
public int minFlips(int a, int b, int c) {
8577
int ans = 0;
86-
for (int i = 0; i < 31; ++i) {
87-
int x = (a >> i) & 1, y = (b >> i) & 1, z = (c >> i) & 1;
88-
if ((x | y) == z) {
89-
continue;
78+
for (int i = 0; i < 30; ++i) {
79+
int x = a >> i & 1, y = b >> i & 1, z = c >> i & 1;
80+
if ((x | y) != z) {
81+
ans += x == 1 && y == 1 ? 2 : 1;
9082
}
91-
if (x == 1 && y == 1 && z == 0) {
92-
++ans;
93-
}
94-
++ans;
9583
}
9684
return ans;
9785
}
@@ -105,11 +93,11 @@ class Solution {
10593
public:
10694
int minFlips(int a, int b, int c) {
10795
int ans = 0;
108-
for (int i = 0; i < 31; ++i) {
109-
int x = (a >> i) & 1, y = (b >> i) & 1, z = (c >> i) & 1;
110-
if ((x | y) == z) continue;
111-
if (x == 1 && y == 1 && z == 0) ++ans;
112-
++ans;
96+
for (int i = 0; i < 30; ++i) {
97+
int x = a >> i & 1, y = b >> i & 1, z = c >> i & 1;
98+
if ((x | y) != z) {
99+
ans += x == 1 && y == 1 ? 2 : 1;
100+
}
113101
}
114102
return ans;
115103
}
@@ -119,19 +107,18 @@ public:
119107
### **Go**
120108
121109
```go
122-
func minFlips(a int, b int, c int) int {
123-
ans := 0
124-
for i := 0; i < 31; i++ {
125-
x, y, z := (a>>i)&1, (b>>i)&1, (c>>i)&1
126-
if (x | y) == z {
127-
continue
128-
}
129-
if x == 1 && y == 1 && z == 0 {
130-
ans++
110+
func minFlips(a int, b int, c int) (ans int) {
111+
for i := 0; i < 30; i++ {
112+
x, y, z := a>>i&1, b>>i&1, c>>i&1
113+
if (x | y) != z {
114+
if x == 1 && y == 1 {
115+
ans += 2
116+
} else {
117+
ans++
118+
}
131119
}
132-
ans++
133120
}
134-
return ans
121+
return
135122
}
136123
```
137124

solution/1300-1399/1318.Minimum Flips to Make a OR b Equal to c/Solution.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ class Solution {
22
public:
33
int minFlips(int a, int b, int c) {
44
int ans = 0;
5-
for (int i = 0; i < 31; ++i) {
6-
int x = (a >> i) & 1, y = (b >> i) & 1, z = (c >> i) & 1;
7-
if ((x | y) == z) continue;
8-
if (x == 1 && y == 1 && z == 0) ++ans;
9-
++ans;
5+
for (int i = 0; i < 30; ++i) {
6+
int x = a >> i & 1, y = b >> i & 1, z = c >> i & 1;
7+
if ((x | y) != z) {
8+
ans += x == 1 && y == 1 ? 2 : 1;
9+
}
1010
}
1111
return ans;
1212
}
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
func minFlips(a int, b int, c int) int {
2-
ans := 0
3-
for i := 0; i < 31; i++ {
4-
x, y, z := (a>>i)&1, (b>>i)&1, (c>>i)&1
5-
if (x | y) == z {
6-
continue
1+
func minFlips(a int, b int, c int) (ans int) {
2+
for i := 0; i < 30; i++ {
3+
x, y, z := a>>i&1, b>>i&1, c>>i&1
4+
if (x | y) != z {
5+
if x == 1 && y == 1 {
6+
ans += 2
7+
} else {
8+
ans++
9+
}
710
}
8-
if x == 1 && y == 1 && z == 0 {
9-
ans++
10-
}
11-
ans++
1211
}
13-
return ans
12+
return
1413
}

solution/1300-1399/1318.Minimum Flips to Make a OR b Equal to c/Solution.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
class Solution {
22
public int minFlips(int a, int b, int c) {
33
int ans = 0;
4-
for (int i = 0; i < 31; ++i) {
5-
int x = (a >> i) & 1, y = (b >> i) & 1, z = (c >> i) & 1;
6-
if ((x | y) == z) {
7-
continue;
4+
for (int i = 0; i < 30; ++i) {
5+
int x = a >> i & 1, y = b >> i & 1, z = c >> i & 1;
6+
if ((x | y) != z) {
7+
ans += x == 1 && y == 1 ? 2 : 1;
88
}
9-
if (x == 1 && y == 1 && z == 0) {
10-
++ans;
11-
}
12-
++ans;
139
}
1410
return ans;
1511
}
Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
class Solution:
22
def minFlips(self, a: int, b: int, c: int) -> int:
33
ans = 0
4-
for i in range(31):
5-
x, y, z = (a >> i) & 1, (b >> i) & 1, (c >> i) & 1
6-
if (x | y) == z:
7-
continue
8-
if x == 1 and y == 1 and z == 0:
9-
ans += 2
10-
else:
11-
ans += 1
4+
for i in range(30):
5+
x, y, z = a >> i & 1, b >> i & 1, c >> i & 1
6+
if x | y != z:
7+
ans += 2 if x == 1 and y == 1 else 1
128
return ans

solution/1300-1399/1323.Maximum 69 Number/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:贪心**
55+
56+
我们将数组转换为字符串,然后从左到右遍历字符串,找到第一个出现的 $6$,将其替换为 $9$,然后返回转换后的字符串对应的整数即可。
57+
58+
时间复杂度 $O(\log num)$,空间复杂度 $O(\log num)$。其中 $num$ 为给定的整数。
59+
5460
<!-- tabs:start -->
5561

5662
### **Python3**

0 commit comments

Comments
 (0)