回答編集履歴

2

追記コードが分かりにくいので置き換え

2022/03/21 22:52

投稿

xebme
xebme

スコア1081

test CHANGED
@@ -36,33 +36,49 @@
36
36
  仕様の理解が正しいかどうか自信がありません。チェックプログラムを追記します。計算量はO(2^N)です。
37
37
 
38
38
  ```Java
39
- static void checkSumming(int[] nums) {
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
- e -> Stream.of(e.split("\\+"))
40
+ import java.util.Comparator;
46
- .map(Integer::valueOf)
41
+ import java.util.List;
47
- .collect(Collectors.summingInt(x -> x))))
48
- .entrySet().stream()
42
+ import java.util.Map;
49
- .sorted(Comparator.comparing(x->x.getKey()))
43
+ import java.util.stream.Collectors;
50
- .map(x -> x.getKey() + ":" + x.getValue().toString())
51
- .forEach(System.out::println);
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
- static List<String> sumExpressions(int[] nums) {
52
+ static void listAll(int[] nums) {
53
+
54
+ // 答えを追加していく集合
55
- List<String> ans = new ArrayList<>();
55
+ List<String> ans = new ArrayList<>();
56
- ans.add("0");
56
+ ans.add("0");
57
+
58
+ // 和の式を作成
57
- List<String> tmp = new ArrayList<>();
59
+ List<String> tmp = new ArrayList<>();
58
- for (int n : nums) {
60
+ for (int n : nums) {
59
- tmp.clear();
61
+ tmp.clear();
60
- for (String e : ans) {
62
+ for (String e : ans) {
61
- String s = e + "+" + n;
63
+ String s = e + "+" + n;
62
- tmp.add(s);
64
+ tmp.add(s);
63
- }
65
+ }
64
- ans.addAll(tmp);
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
- return ans;
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

仕様の理解について追記

2022/03/20 12:10

投稿

xebme
xebme

スコア1081

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
+ ```