このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
lucky ticketという数字は桁数が2*n(nは自然数)で、前半のn桁と、後半のn桁の各桁の合計が一致する。sという数字のみからなる文字列が与えられたとき、lucky ticketになる部分文字列で最長になるものを求め、その長さを返すメソッドを作成せよ。
私の解答はこちら。
public class LuckyTicketSubstring { public int maxLength(String s) { int maxlen = 0; for( int from=0 ; from<s.length() ; from++ ){ for( int to=from+1 ; to<s.length() ; to++ ){ // 切り出す範囲の文字数が奇数なら考える必要なし // 添え字がfromからtoまでを切り出して考えることにする if( (to-from)%2 == 0 ) continue; int half = (to+from)/2; String first = s.substring(from, half+1); String second = s.substring(half+1, to+1); int sum1 = 0; int sum2 = 0; for( int i=0 ; i<first.length() ; i++ ){ // 前半と後半の数字の合計を計算 sum1 += first.charAt(i) - '0'; sum2 += second.charAt(i) - '0'; } int len = first.length()*2; if( len > maxlen && sum1 == sum2 ){ // 合致の条件 maxlen = to - from + 1; } } } return maxlen; } }
得点は164.82/250、1回のsubmitでシステムテストクリア。当日の正解率は約85%。Stringの生成が多いので、最初にfrom-to+1がmaxlen以下ならcontinueするという条件を付けた方がいいのかなと思いました。
0 件のコメント:
コメントを投稿