はじめに
研修でGoogle Tech Dev Guideの問題を解いていたので、
自分なりに考えたことをメモとして残します。
今回解いた問題
問題
問題文を抜粋すると
Given a string, return the sum of the numbers appearing in the string, ignoring all other characters. A number is a series of 1 or more digit chars in a row. (Note: Character.isDigit(char) tests if a char is one of the chars '0', '1', .. '9'. Integer.parseInt(string) converts a string to an int.)
とのこと。
要約すると、「受け取った文字列から数値のみを取り出しを加算する」といった内容です。
文章のみだと分かりづらいと思うのですが、
下記のような出力になればいいみたいです(sumNumbersメソッドを実装する)
sumNumbers("abc123xyz") → 123
sumNumbers("aa11b33") → 44
sumNumbers("7 11") → 18
↑を見ていただくと分かるかと思うのですが、
数値の間に文字列または空白があった場合は、それぞれの数値を加算する必要があります。
さっそく解いてみた
まずは、文字列中に含まれるかもしれない要素を洗い出しました。
- 文字列
- 数値
- 空白
上記を踏まえ、今回は下記のようなアプローチをとりました。
1.数値以外の要素を全て空白に変換
2.空白区切りで配列に格納
3.配列の中で空の要素以外を全て加算
最終的に下記のようなコードになりました。
class Test1{
public static void main(String args[]){
// 動作確認用
System.out.println(sumNumbers("abc123xyz"));
System.out.println(sumNumbers("aa11b33"));
System.out.println(sumNumbers("7 11"));
}
public static int sumNumbers(String str) {
// 1.数字以外をすべて半角スペースに変換
String buf = str.replaceAll("[^0-9]", " ");
// 2.空白区切りで配列に格納
String list[] = buf.split(" ");
int sum = 0;
// 3.配列の中で空の要素以外を全て加算
for(int i = 0; i < list.length; i++){
if (!(list[i].isEmpty())){
sum = sum + Integer.parseInt(list[i]);
}
}
return sum;
}
}
「もっとこうした方がいい!」等ありましたら、ぜひご指摘をいただければと思います!
おまけ
普段はRubyで書いているので、Rubyでも解いてみました。
def sumNumbers(str)
str.gsub(/[^0-9]/," ")
.split(" ")
.compact
.reject(&:empty?)
.sum{|v| v.to_i}
end
#動作確認用
puts sumNumbers("abc123xyz")
puts sumNumbers("aa11b33")
puts sumNumbers("7 11")
rubyだとメソッドチェーンを使って書けるので楽しいですよね!