こちらのサイトの問題をjava8で解いています。
https://www.hackerrank.com/challenges/absolute-permutation/problem
(問題内容)
・整数 n(1≦n≦10)と整数 k(0≦k<n)が入力される。
・1からnまでの順列(n = 5だったら1,2,3,4,5)の数字を全て使って
順列の位置i(1〜n)との絶対値の差が常にkになるような配列をつくって戻り値として返す。
・該当しなかったら-1のみ配列に入れて戻り値として返す。
→上記の処理を書いた「absolutePermutation()」を完成させる。
苦戦したため、知人にC++で回答を作ってもらいました。
C++の回答をJavaに変えて書きたいのですが、わからない点があるため、質問させてください。
C++
1//知人に書いてもらったコード 2コード 3vector<int> absolutePermutation(int n, int k) { 4 set<int> used; 5 bool flag = true; 6 vector<int> ans; 7 for(int i=1; i<=n; i++) { 8 if(i-k >= 1 && used.find(i-k) == used.end()) { 9 used.insert(i-k); 10 ans.push_back(i-k); 11 continue; 12 } 13 if (i+k <= n && used.find(i+k) == used.end()) { 14 used.insert(i+k); 15 ans.push_back(i+k); 16 continue; 17 } 18 flag = false; 19 break; 20 } 21 22 if(!flag) { 23 return vector<int>(1, -1); 24 } else { 25 return ans; 26 } 27}
わからない点
■if(i-k >= 1 && used.find(i-k) == used.end())の部分
→find()やend()を使用する場合、Matcherを使うことになると思いますが、
調べてみると、「Stringの文字列からある文字列を検索する方法」しか見つけられず、
Set型からある数字を見つけ出す方法がわかりません。
→Matcherを使わず、used.stream()で検索をかける方法を試そうと思いましたが、
end()をどのように表現するかがわかりません。
また、いちいちListを用意しようとしているのですが、何かいいやり方はあるのでしょうか。
■戻す値がint[]なので、最初からansをint[]で書きたいのですが
定義する際に長さを指定できないため、Listを使っています。
if(!flag)以下でint[]に変換していますが、この方法でよいのでしょうか。
なにかいい方法があれば教えていただけると助かります。
途中までJavaで書いたコード(Streamを使っている方)
Java
1static int[] absolutePermutation(int n, int k) { 2 Set<Integer> used = new HashSet<Integer>(); 3 boolean flag = true; 4 ArrayList<Integer> ans = new ArrayList<>(); 5 6 for(int i=1; i<=n; i++) { 7 if(i-k >= 1){ 8 List<Integer> a = used.stream().filter(x -> x==(i-k)).collect(toList()); 9 if( a == ■ここでused.end()の表現をしたい){ 10 used.add(i-k); 11 ans.add(i-k); 12 continue; 13 } 14 } 15 if(i+k <= n){ 16 List<Integer> a = used.stream().filter(x -> x==(i+k)).collect(toList()); 17 if( a == ■ここでused.end()の表現をしたい){ 18 used.add(i+k); 19 ans.add(i+k); 20 continue; 21 } 22 } 23 flag = false; 24 break; 25 } 26 if(!flag) { 27 ans.add(-1); 28 int[] a = new int[ans.size()]; 29 a[0] = ans.get(0); 30 return a; 31 } else { 32 int[] a = new int[ans.size()]; 33 for(int i = 0;i < ans.size();i++){a[i] = ans.get(i);} 34 return a; 35 } 36}
拙い文で申し訳ありません。
ヘルプしていただけると助かります。
よろしくお願いします。
ーーーーーーーーーーーーーーーーーーーーーーーー
修正したコードを掲載します。
コンパイルはできましたが、テストが模範どおりの結果になりません。
修正点をご指摘いただけると助かります。
Java
1 Set<Integer> used = new HashSet<Integer>(); 2 boolean flag = true; 3 int[] ans = new int[n]; 4 5 for(int i=1; i<=n; i++) { 6 if ( i-k >= 1 && !used.contains(i-k) ){ 7 used.add(i-k); 8 ans[n-1]= i-k; 9 continue; 10 } 11 if( i+k <= n && !used.contains(i+k) ){ 12 used.add(i+k); 13 ans[n-1]= i+k; 14 continue; 15 } 16 flag = false; 17 break; 18 } 19 20 if(!flag) { 21 ans[0] = -1; 22 return ans; 23 } else { 24 return ans; 25 } 26 } 27コード
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/29 13:36
2020/04/29 14:13
2020/04/29 14:35
2020/04/29 14:51
2020/04/29 15:07
2020/04/30 06:28
2020/04/30 06:38
2020/04/30 06:56