【Java】文字列のfor文(B - OddString)
解いた問題
AtCoderの「B - OddString」
提出した回答
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String S = sc.next(); sc.close(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < S.length(); i++) { if (i % 2 == 0) { sb.append(S.charAt(i)); } } System.out.println(sb); } }
奇数文字列目を抜き出す。"0”スタートにして、2で割った余りが"0"になるよう設定した。
TODO
- 他のA,B問題を解く
おわり。。
【Java】値にindexを持たせて格納する(B - Palace)
解いた問題
AtCoderの「B - Palace」
提出した回答
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int T = sc.nextInt(); int A = sc.nextInt(); Map<Integer, Double> map = new HashMap<>();//index,Aとの気温差 int minKey = 0; double minValue = 0; for (int i = 1; i <= N; i++) { map.put(i, Math.abs((T - sc.nextInt() * 0.006) - A )); if (i == 1) { minKey = 1; minValue = map.get(1); continue; } if (map.get(i) < minValue) { minKey = i; minValue = map.get(i); } } System.out.println(minKey); sc.close(); } }
「地点の番号を出力する」ため、for文でindexを格納する必要があった。Listでは出来ない(思いついていない)ので、HashMapを使った。
for文の「i」(index)と入力された値をセットで格納している。
値は、問題通りの計算に加え、Aとの絶対値を計算してから格納している。
あとは各「i」の値で「i-1」の値と比べ、小さい値(Aと近い値)を採用する。
TODO
- 他のA,B問題を解く
おわり。。
【Java】数値比較(B - Maximum Difference)
解いた問題
AtCoderの「B - Maximum Difference」
提出した回答
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int min = 0; int max = 0; for (int i = 0; i < N; i++) { int tmp = sc.nextInt(); if (i == 0) { min = tmp; max = tmp; } if (tmp < min) { min = tmp; } if (max < tmp) { max = tmp; } } System.out.println(max - min); sc.close(); } }
初めはListに入れることを考えたが、最小値・最大値を保持して差を取れば良いことに気づいたので、for文を1度回して値を確認した。
TODO
- 他のA,B問題を解く
おわり。。
【Java】全探索(B - Break Number)
解いた問題
AtCoderの「B - Break Number」
提出した回答
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); sc.close(); int result = 1; //出力する値 int counter_max = 0; //2で割れる回数が1番多いときの値 for (int i = 1; i <= N; i++) { int counter_current = 0; //現在のiが2で割れる回数 boolean flag = true; int tmp = i; while (flag) { if (tmp % 2 == 0) { tmp /= 2; counter_current += 1; } else { flag = false; } } if (counter_max < counter_current) { counter_max = counter_current; result = i; } } System.out.println(result); } }
全探索で解いた。
2で割れる回数をカウントして、より2で割れる回数が多いものを採用している。
方法は思いついていないが、途中のwhile文を無くしてすっきりさせたい。
TODO
- 他のA,B問題を解く
おわり。。
【Java】辞書順に並べ替え(B - Two Anagrams)
解いた問題
AtCoderの「B - Two Anagrams」
提出した回答
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); String t = sc.next(); sc.close(); //s_dash char[] s_stringToCharArray = s.toCharArray(); Arrays.sort(s_stringToCharArray); String s_dash = String.valueOf(s_stringToCharArray); //t_dash char[] t_stringToCharArray = t.toCharArray(); Arrays.sort(t_stringToCharArray); StringBuilder t_dash = new StringBuilder(); //降順に追加していく for (int i = t_stringToCharArray.length -1 ; 0 <= i; i--) { t_dash.append(t_stringToCharArray[i]); } //比較 if (s_dash.compareTo(String.valueOf(t_dash)) < 0) { System.out.println("Yes"); } else { System.out.println("No"); } } }
- sの各文字を辞書順に昇順に並び替えた文字列(最も辞書順が早いs)
- tの各文字を辞書順に降順に並び替えた文字列(最も辞書順が遅いt)
を比較する方針で書いた。
文字列の辞書順の比較はcompareToメソッドを使用した。
2つの文字列を辞書的に比較します。比較は文字列内のそれぞれの文字のUnicode値に基づいて行われます。この
String
オブジェクトによって表される文字シーケンスが、引数文字列によって表される文字シーケンスと辞書的に比較されます。このString
オブジェクトが辞書的に引数文字列より前にある場合は、結果は負の整数になります。このString
オブジェクトが辞書的に引数文字列の後ろにある場合、結果は正の整数になります。それらの文字列が等しい場合、結果はゼロになります。compareTo
から0
が返されるのは、equals(Object)
メソッドからtrue
が返される場合だけです。
戻り値: 引数文字列がこの文字列に等しい場合は、値 0
。この文字列が文字列引数より辞書式に小さい場合は、0
より小さい値。この文字列が文字列引数より辞書式に大きい場合は、0
より大きい値。
つまり、「文字列A」.compareTo(「文字列B」)とすると
- 戻り値 < 0 :文字列Aが文字列Bより辞書順で先
- 戻り値 = 0 :文字列Aと文字列Bが辞書順で等しい
- 戻り値 > 0 :文字列Aが文字列Bより辞書順で後
となる。
今回与えられる文字列は英小文字のみなのでcompareToで良いが、もし大文字も含まれるならcompareToIgnoreCaseを使用すると良さそう。
大文字と小文字の区別なしで、2つの文字列を辞書的に比較します。このメソッドは、文字列の正規化バージョンで
compareTo
を呼び出して得られた符号を持つ整数を返します。ここでは、各文字でCharacter.toLowerCase(Character.toUpperCase(character))
を呼び出すことで大文字と小文字の違いがなくなります。
TODO
- 他のA,B問題を解く
おわり。。
【Java】文字の連結(B - i18n)
解いた問題
提出した回答1
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String S = sc.next(); sc.close(); String start = String.valueOf(S.charAt(0)); String end = String.valueOf(S.charAt(S.length() -1)); String inner = String.valueOf(S.length()-2); System.out.println(start + inner + end); } }
valueOf(char c)・valueOf(int i)で、文字列表現を返す。
強引なやり方な気がする。
実行時間は103msだった。
提出した回答2
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String S = sc.next(); sc.close(); StringBuilder sb = new StringBuilder(); sb.append(S.charAt(0)).append(S.length()-2).append(S.charAt(S.length()-1)); System.out.println(sb); } }
StringBuilderを作成して、それに1つずつ追加する。
実行時間は98msだった。
TODO
- 他のA,B問題を解く
おわり。。
【Java】文字列の置換(A - Already 2018)
解いた問題
AtCoderの「A - Already 2018」
提出した回答
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String S = sc.next(); System.out.println(S.replace("2017/01/", "2018/01/")); } }
シンプルに置換した。
問題に「2017/01」までは必ず入力されるとあるので、できる限り長い文字列を置換するようにした。
StringBuilderクラスを使い、文字列を渡し「setCharAt」を使っても良さそう。
TODO
- 他のA,B問題を解く
おわり。。