こんなんしらんし。。ってテクニックですな。
アルファベットを大文字から小文字にunicodeの数字を使って変換するやり方
それに関してはこちらで。(このテクニックは大文字に+20すると小文字に変換できるよーって話でした)
アルファベットごとに対応する数字を出して、バケットソートしたいとき(与えられた文字列a-zがいくつあるか調べたいとき)
上記で出題。僕は最初無理くりMap
とHashMap
でACさせました。。
無理くりなロジックを考えるときは絶対に楽なアルゴリズムがある。バケットソートはなぜかいつも思いつかない。(慣れ?)
当たり前ですが、char a = 'a'
に対して-'a'
をすると、0
という値が返ってきます。(61-61なので)
ではb-a, c-aとやっていくとどうなるか、というと0,1,2...
という値が返ってきます。
int[] a = new int[26]
と箱を作っておくことで、各アルファベットに対応したバケットソートが可能です。
注意
上記のやり方は、全て文字列が小文字の場合に有効です。そのため、ちゃんとString s = tmp.toLowerCase()
を行なっておきましょう。
サンプルコード
import java.util.Scanner; public class Main143 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] a = new int[26]; while(sc.hasNext()) { String s = sc.nextLine(); s = s.toLowerCase(); for(int i=0; i<s.length(); i++) { if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z') { a[s.charAt(i) - 'a']++; } } } for(char i='a'; i<='z'; i++) { System.out.println(i + " : " + a[i-'a']); } } }
出力結果
$ java Main143 this is a pen. a : 1 b : 0 c : 0 d : 0 e : 1 f : 0 g : 0 h : 1 i : 2 j : 0 k : 0 l : 0 m : 0 n : 1 o : 0 p : 1 q : 0 r : 0 s : 2 t : 1 u : 0 v : 0 w : 0 x : 0 y : 0 z : 0