Skip to content

Commit 816e161

Browse files
committed
add existing solutions
1 parent ed1b557 commit 816e161

File tree

234 files changed

+13434
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

234 files changed

+13434
-0
lines changed

existing/3sum-closest.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sort"
6+
)
7+
8+
func abs(num int) int {
9+
if num > 0 {
10+
return num
11+
}
12+
return 0 - num
13+
}
14+
15+
func threeSumClosest(nums []int, target int) int {
16+
sort.Ints(nums)
17+
18+
closest := nums[0] + nums[1] + nums[len(nums) - 1]
19+
var sum int
20+
for i := 0; i < len(nums) - 2; i++ {
21+
low := i + 1
22+
high := len(nums) - 1
23+
for low < high {
24+
sum = nums[i] + nums[low] + nums[high]
25+
if sum == target {
26+
return sum
27+
}
28+
if abs(sum - target) < abs(closest - target) {
29+
closest = sum
30+
}
31+
if sum < target {
32+
low++
33+
}
34+
if sum > target {
35+
high--
36+
}
37+
}
38+
}
39+
40+
return closest
41+
}
42+
43+
func main() {
44+
times := []int{-2, -5, 2, 1, -4}
45+
// times := []int{-1, 2, 1, -4}
46+
fmt.Println(threeSumClosest(times, 1))
47+
48+
fmt.Printf("hello world!\n")
49+
}

existing/3sum.close.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sort"
6+
)
7+
8+
// 使用逼近方法,不用hash存结果
9+
10+
func strip3(nums []int) []int {
11+
if len(nums) == 0 {
12+
return nums
13+
}
14+
newnums := make([]int, 1)
15+
last := nums[0]
16+
newnums[0] = nums[0]
17+
count := 1
18+
for i := 1; i < len(nums); i++ {
19+
if nums[i] == last {
20+
count++
21+
if count < 3 {
22+
newnums = append(newnums, nums[i])
23+
// diffs[last] = len(newnums) - 1
24+
}
25+
if last == 0 && count == 3 {
26+
newnums = append(newnums, nums[i])
27+
// diffs[last] = len(newnums) - 1
28+
}
29+
} else {
30+
last = nums[i]
31+
count = 1
32+
newnums = append(newnums, nums[i])
33+
// diffs[last] = len(newnums) - 1
34+
}
35+
}
36+
return newnums
37+
}
38+
39+
func threeSum(nums []int) [][]int {
40+
results := make([][]int, 0, 200)
41+
sort.Ints(nums)
42+
nums = strip3(nums)
43+
44+
for i := 0; i+2 < len(nums); i++ {
45+
if nums[i] > 0 {
46+
break
47+
}
48+
if i > 0 && nums[i] == nums[i-1] {
49+
continue
50+
}
51+
low := i + 1
52+
high := len(nums) - 1
53+
for low < high {
54+
if nums[i]+nums[low]+nums[high] == 0 {
55+
results = append(results, []int{nums[i], nums[low], nums[high]})
56+
}
57+
if nums[i]+nums[low]+nums[high] <= 0 {
58+
for {
59+
low++
60+
if low >= high {
61+
break
62+
}
63+
if nums[low] != nums[low-1] {
64+
break
65+
}
66+
}
67+
}
68+
if nums[i]+nums[low]+nums[high] > 0 {
69+
for {
70+
high--
71+
if low >= high {
72+
break
73+
}
74+
if nums[high] != nums[high+1] {
75+
break
76+
}
77+
}
78+
}
79+
}
80+
}
81+
82+
return results
83+
}
84+
85+
func main() {
86+
data := []int{-1, 0, 1, 2, -1, -4}
87+
// data := []int{-1, 0, 1, 0}
88+
// data := []int{0, 0, 0, 0}
89+
90+
fmt.Println(threeSum(data))
91+
}

existing/3sum.hash.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sort"
6+
)
7+
8+
// 将差值保存在hash中,减少比对次数
9+
10+
var diffs map[int]int
11+
12+
func strip3(nums []int) []int {
13+
if len(nums) == 0 {
14+
return nums
15+
}
16+
newnums := make([]int, 1)
17+
last := nums[0]
18+
newnums[0] = nums[0]
19+
count := 1
20+
for i := 1; i < len(nums); i++ {
21+
if nums[i] == last {
22+
count++
23+
if count < 3 {
24+
newnums = append(newnums, nums[i])
25+
// diffs[last] = len(newnums) - 1
26+
}
27+
if last == 0 && count == 3 {
28+
newnums = append(newnums, nums[i])
29+
// diffs[last] = len(newnums) - 1
30+
}
31+
} else {
32+
last = nums[i]
33+
count = 1
34+
newnums = append(newnums, nums[i])
35+
// diffs[last] = len(newnums) - 1
36+
}
37+
}
38+
return newnums
39+
}
40+
41+
func threeSum(nums []int) [][]int {
42+
results := make([][]int, 0, 100)
43+
diffs = make(map[int]int)
44+
sort.Ints(nums)
45+
nums = strip3(nums)
46+
47+
for i := 0; i < len(nums); i++ {
48+
diffs[nums[i]] = i
49+
}
50+
51+
for i := 0; i+2 < len(nums); i++ {
52+
if nums[i] > 0 {
53+
break
54+
}
55+
if i > 0 && nums[i] == nums[i-1] {
56+
continue
57+
}
58+
for j := i + 1; j+1 < len(nums); j++ {
59+
if nums[j] == nums[j-1] && j-1 > i {
60+
continue
61+
}
62+
diff := 0 - (nums[i] + nums[j])
63+
if pos, ok := diffs[diff]; ok {
64+
if pos > j {
65+
// fmt.Printf("%d %d %d\n", i, j, pos)
66+
results = append(results, []int{nums[i], nums[j], diff})
67+
} else {
68+
break
69+
}
70+
}
71+
}
72+
}
73+
74+
return results
75+
}
76+
77+
func main() {
78+
data := []int{-1, 0, 1, 2, -1, -4}
79+
// data := []int{-1, 0, 1, 0}
80+
// data := []int{0, 0, 0, 0}
81+
82+
fmt.Println(threeSum(data))
83+
}

existing/add-binary.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#include <cstdio>
2+
#include <vector>
3+
#include <iostream>
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
string addBinary(string a, string b) {
9+
this->flip(a);
10+
this->flip(b);
11+
string result;
12+
if (a.size() > b.size()) {
13+
result.resize(a.size() + 1, '0');
14+
} else {
15+
result.resize(b.size() + 1, '0');
16+
}
17+
18+
int index = 0;
19+
20+
while(index < result.size()) {
21+
int a1 =0, b1 = 0;
22+
if (index < a.size()) {
23+
a1 = a[index] - 0x30;
24+
}
25+
if (index < b.size()) {
26+
b1 = b[index] - 0x30;
27+
}
28+
// cout << a1 << '|' << b1 << ':' << result << endl;
29+
30+
if (a1 + b1 == 2) {
31+
result[index+1] = '1';
32+
}
33+
if(a1 + b1 == 1) {
34+
if (result[index] == '1') {
35+
result[index+1] = '1';
36+
result[index] = '0';
37+
} else {
38+
result[index] = '1';
39+
}
40+
}
41+
42+
index++;
43+
}
44+
if (result.size() > 1 && result[result.size() - 1] == '0') {
45+
result.resize(result.size() - 1);
46+
}
47+
// cout << result << '|' << result[0] - 0x30 << ':' << result.size() << endl;
48+
this->flip(result);
49+
// cout << result << '|' << result[0] - 0x30 << ':' << result.size() << endl;
50+
return result;
51+
}
52+
53+
void flip(string& a) {
54+
if (a.size() == 1) {
55+
return;
56+
}
57+
int i = 0,j = 0;
58+
char ch;
59+
int length = a.size();
60+
while(true) {
61+
j = length - i - 1;
62+
// cout << i << '|' << j << endl;
63+
if (i >= j) {
64+
break;
65+
}
66+
ch = a[i];
67+
a[i] = a[j];
68+
a[j] = ch;
69+
i++;
70+
}
71+
}
72+
};
73+
74+
int main()
75+
{
76+
Solution s;
77+
// cout << s.flip("0") << endl;
78+
cout << s.addBinary("0", "0") << endl;
79+
cout << s.addBinary("1", "0") << endl;
80+
cout << s.addBinary("11", "0") << endl;
81+
cout << s.addBinary("11", "100") << endl;
82+
cout << s.addBinary("11", "1") << endl;
83+
cout << s.addBinary("1010", "1011") << endl;
84+
85+
86+
return 0;
87+
}

existing/add-digits.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <cstdio>
2+
#include <map>
3+
#include <iostream>
4+
5+
using namespace std;
6+
7+
8+
class Solution {
9+
public:
10+
int addDigits(int n) {
11+
if (n < 10) {
12+
return n;
13+
}
14+
int mod = n % 9;
15+
if (mod == 0) {
16+
return 9;
17+
}
18+
return mod;
19+
}
20+
};
21+
22+
23+
class Solution1 {
24+
public:
25+
int addDigits(int n) {
26+
if (n < 10) {
27+
return n;
28+
}
29+
int sum = 0;
30+
while(true) {
31+
int mod = n % 10;
32+
sum += mod;
33+
if (n > 9) {
34+
n = n / 10;
35+
continue;
36+
}
37+
break;
38+
}
39+
return this->addDigits(sum);
40+
}
41+
};
42+
43+
int main()
44+
{
45+
Solution s;
46+
for (int i = 0; i < 100; ++i)
47+
{
48+
cout << i << ":" << s.addDigits(i) << endl;
49+
}
50+
51+
return 0;
52+
}

0 commit comments

Comments
 (0)