はじめに
自分用の備忘録。たまにポイントが書かれている。 それに加えて音声入力の実験を行っています(笑)
問題と公式の解答例
A - Yay! 問題
解答例
解答例(公式C++をJavaに変換)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.next(); int n = s.length(); for(int i = 0; i < n; i++){ boolean diff = true; for(int j = 0; j < n; j++){ if(i != j && s.charAt(i) == s.charAt(j)) diff = false; } if(diff) System.out.println(i + 1); } scanner.close(); } }
メモ
ポイント
- 同じ文字が含まれていたら
diff
をfalse
にする。 - 自分と比較はするな
- 同じ文字を上下に二つ並べて一文字ずつ、「ちがう、おなじ」を繰り返していくイメージ。
- 同じ文字を上下に二つ並べて一文字ずつ、「ちがう、おなじ」を繰り返していくイメージ。
この問題の解き方としては、次の通り。 1文字目をそれ以外の文字と比較!全てと同じなら、diff(ここでは「different=違う」という意味)がfalseにする。要するに、違わないよー、一緒だよーっていう。もし!違うのなら、trueに設定!はじめから設定されていますが。あと、「1文字目意外と比較する」には、if文で「 i != j かつ、文字が一緒なら」という条件に設定することで可能!iとjに比較する文字数が入りますので。
それではまた。
(未来の自分よ、わかりにくかったら追記してくれ。)
自作の解答例
import java.util.HashSet; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String S = sc.nextLine(); int ans = 0; HashSet<Character> list = new HashSet<Character>(); for (int i = 0; i < S.length(); i++) { list.add(S.charAt(i)); } for (Character character : list) { int counter = 0; int lastIndex = 0; for (int j = 0; j < S.length(); j++) { if (character == S.charAt(j)) { counter ++; lastIndex = j; } } if (counter == 1) { ans = lastIndex + 1; } } System.out.println(ans); } }
メモ
解放 解法の簡単なメモをここに記す。 hashsetでどの文字が使われているかをまずは特定する。 hashsetっていうのは重複した値を自動的に削除してリストを作ってくれるそういう便利なリスト的なやつです。じゃあ特定された文字が複数出てくるのかそれとも一つしか出てこないのかをカウントしますと。もしカウントした結果一回しか文字の中に出てこなかったですよ、カウントが1でしたよ、ということならばansに代入する。ここのポイントはプラス位置することでなぜかといえばインデックスはゼロから始まるけれども文字を数えるときには一から始まりますよね。だからです。
ちなみにこれは音声入力で記録しました!ところどころ文字を直しましたが、五ヶ所ぐらいですね。一応読めないことはないかなって感じです。公式の文書として残すの庭修正がたくさん必要ですが記録として残す、メモとして残す庭には充分だと思います!