回答編集履歴
2
追記コードが分かりにくいので置き換え
test
CHANGED
@@ -36,33 +36,49 @@
|
|
36
36
|
仕様の理解が正しいかどうか自信がありません。チェックプログラムを追記します。計算量はO(2^N)です。
|
37
37
|
|
38
38
|
```Java
|
39
|
-
|
39
|
+
import java.util.ArrayList;
|
40
|
-
List<String> result = sumExpressions(nums);
|
41
|
-
System.out.println("size : 2^" + nums.length + " : " + result.size());
|
42
|
-
result.stream()
|
43
|
-
.collect(
|
44
|
-
Collectors.groupingBy(
|
45
|
-
|
40
|
+
import java.util.Comparator;
|
46
|
-
|
41
|
+
import java.util.List;
|
47
|
-
.collect(Collectors.summingInt(x -> x))))
|
48
|
-
|
42
|
+
import java.util.Map;
|
49
|
-
|
43
|
+
import java.util.stream.Collectors;
|
50
|
-
.map(x -> x.getKey() + ":" + x.getValue().toString())
|
51
|
-
|
44
|
+
import java.util.stream.Stream;
|
52
|
-
}
|
53
45
|
|
46
|
+
public class SumExpressions {
|
47
|
+
|
48
|
+
public static void main(String[] args) {
|
49
|
+
listAll(new int[] {1,2,3,5,7});
|
50
|
+
}
|
51
|
+
|
54
|
-
|
52
|
+
static void listAll(int[] nums) {
|
53
|
+
|
54
|
+
// 答えを追加していく集合
|
55
|
-
|
55
|
+
List<String> ans = new ArrayList<>();
|
56
|
-
|
56
|
+
ans.add("0");
|
57
|
+
|
58
|
+
// 和の式を作成
|
57
|
-
|
59
|
+
List<String> tmp = new ArrayList<>();
|
58
|
-
|
60
|
+
for (int n : nums) {
|
59
|
-
|
61
|
+
tmp.clear();
|
60
|
-
|
62
|
+
for (String e : ans) {
|
61
|
-
|
63
|
+
String s = e + "+" + n;
|
62
|
-
|
64
|
+
tmp.add(s);
|
63
|
-
|
65
|
+
}
|
64
|
-
|
66
|
+
ans.addAll(tmp);
|
65
|
-
|
67
|
+
}
|
68
|
+
|
69
|
+
// 式の個数を出力
|
70
|
+
System.out.println("size : 2^" + nums.length + " : " + ans.size());
|
71
|
+
// 和の組み合わせを出力
|
72
|
+
ans.stream().collect(
|
73
|
+
Collectors.groupingBy(
|
74
|
+
e -> Stream.of(e.split("\\+"))
|
75
|
+
.map(Integer::valueOf)
|
76
|
+
.collect(Collectors.summingInt(x -> x))
|
77
|
+
)
|
66
|
-
|
78
|
+
).entrySet().stream()
|
79
|
+
.sorted(Comparator.comparing(Map.Entry::getKey))
|
80
|
+
.map(e -> e.getKey() + " : " + e.getValue())
|
81
|
+
.forEach(System.out::println);
|
67
|
-
|
82
|
+
}
|
83
|
+
}
|
68
84
|
```
|
1
仕様の理解について追記
test
CHANGED
@@ -31,3 +31,38 @@
|
|
31
31
|
|
32
32
|
コードにバグがあれば私の責任です。
|
33
33
|
|
34
|
+
**追記(仕様について)**
|
35
|
+
|
36
|
+
仕様の理解が正しいかどうか自信がありません。チェックプログラムを追記します。計算量はO(2^N)です。
|
37
|
+
|
38
|
+
```Java
|
39
|
+
static void checkSumming(int[] nums) {
|
40
|
+
List<String> result = sumExpressions(nums);
|
41
|
+
System.out.println("size : 2^" + nums.length + " : " + result.size());
|
42
|
+
result.stream()
|
43
|
+
.collect(
|
44
|
+
Collectors.groupingBy(
|
45
|
+
e -> Stream.of(e.split("\\+"))
|
46
|
+
.map(Integer::valueOf)
|
47
|
+
.collect(Collectors.summingInt(x -> x))))
|
48
|
+
.entrySet().stream()
|
49
|
+
.sorted(Comparator.comparing(x->x.getKey()))
|
50
|
+
.map(x -> x.getKey() + ":" + x.getValue().toString())
|
51
|
+
.forEach(System.out::println);
|
52
|
+
}
|
53
|
+
|
54
|
+
static List<String> sumExpressions(int[] nums) {
|
55
|
+
List<String> ans = new ArrayList<>();
|
56
|
+
ans.add("0");
|
57
|
+
List<String> tmp = new ArrayList<>();
|
58
|
+
for (int n : nums) {
|
59
|
+
tmp.clear();
|
60
|
+
for (String e : ans) {
|
61
|
+
String s = e + "+" + n;
|
62
|
+
tmp.add(s);
|
63
|
+
}
|
64
|
+
ans.addAll(tmp);
|
65
|
+
}
|
66
|
+
return ans;
|
67
|
+
}
|
68
|
+
```
|