diff --git a/pullrequests/valid_palindrome/step1.go b/pullrequests/valid_palindrome/step1.go new file mode 100644 index 0000000..100f666 --- /dev/null +++ b/pullrequests/valid_palindrome/step1.go @@ -0,0 +1,30 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +import "unicode" + +/* +時間:12分 + +解法自体はすぐに思いついたが、すんなり実装できないところがまだまだ課題。 +continueすることを忘れていたりなどケアレスミスが目立った。 +*/ +func isPalindromeStep1(s string) bool { + sRunes := []rune(s) + for i, j := 0, len(s)-1; i < j; { + if !(unicode.IsDigit(sRunes[i]) || unicode.IsLetter(sRunes[i])) { + i++ + continue + } + if !(unicode.IsDigit(sRunes[j]) || unicode.IsLetter(sRunes[j])) { + j-- + continue + } + if unicode.ToLower(sRunes[i]) != unicode.ToLower(sRunes[j]) { + return false + } + i++ + j-- + } + return true +} diff --git a/pullrequests/valid_palindrome/step2.go b/pullrequests/valid_palindrome/step2.go new file mode 100644 index 0000000..0a4fac5 --- /dev/null +++ b/pullrequests/valid_palindrome/step2.go @@ -0,0 +1,30 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +import "unicode" + +/* +Two Pointersなのでi, jではなく、left, rightを使うようにした。 + +質問:sをrune型配列にキャストした変数名を`sRunes`や`runeS`などにしてみたのですが、あまりしっくりきてないです。良い名前や`sRunes`と`runeS`ならどちらの方が良さげなどありますか +*/ +func isPalindromeStep2(s string) bool { + runeS := []rune(s) + left, right := 0, len(s)-1 + for left < right { + if !(unicode.IsDigit(runeS[left]) || unicode.IsLetter(runeS[left])) { + left++ + continue + } + if !(unicode.IsDigit(runeS[right]) || unicode.IsLetter(runeS[right])) { + right-- + continue + } + if unicode.ToLower(runeS[left]) != unicode.ToLower(runeS[right]) { + return false + } + left++ + right-- + } + return true +}