Số đối xứng (Palindrome Number)

9. Palindrome Number

Đề bài

Hãy xác định một số nguyên x có phải là số đối xứng (palindrome) hay không.

Một số nguyên được gọi là palindrome nếu đọc từ trái sang phải hay từ phải sang trái đều giống nhau.

Ví dụ 1:

Input: 121 Output: true

Ví dụ 2:

Input: -121 Output: false Explanation: Đọc từ trái sang phải là -121, còn từ phải sang trái sẽ thành 121- nên không đối xứng.

Ví dụ 3:

Input: 10 Output: false Explanation: Đọc ngược sẽ là 01 (tức 1), nên không đối xứng.

Follow up:

Bạn có thể giải bài này không cần chuyển số sang chuỗi không?

Ràng buộc:

  • 231x2311-2^{31} \le x \le 2^{31} - 1

Tóm tắt đề

Trả về true nếu x là palindrome, ngược lại trả về false.

Các trường hợp cần chú ý:

  • Số âm luôn không đối xứng (vì có dấu -).
  • Số có chữ số cuối là 0 (nhưng khác 0) luôn không đối xứng, vì số đảo sẽ có 0 ở đầu.

Ý tưởng

Trong code bên dưới có 2 cách:

  • Cách 1 (không dùng chuỗi): Tách từng chữ số bằng % 10/ 10, lưu vào mảng, sau đó so sánh đối xứng hai đầu.
  • Cách 2 (dùng chuỗi): Đổi sang chuỗi rồi so sánh ký tự đối xứng hai đầu.

Code

package leetcode import "strconv" // Cách 1: không chuyển sang chuỗi func isPalindrome(x int) bool { if x < 0 { return false } if x == 0 { return true } if x%10 == 0 { return false } arr := make([]int, 0, 32) for x > 0 { arr = append(arr, x%10) x = x / 10 } sz := len(arr) for i, j := 0, sz-1; i <= j; i, j = i+1, j-1 { if arr[i] != arr[j] { return false } } return true } // Cách 2: chuyển số sang chuỗi rồi kiểm tra func isPalindrome1(x int) bool { if x < 0 { return false } if x < 10 { return true } s := strconv.Itoa(x) length := len(s) for i := 0; i <= length/2; i++ { if s[i] != s[length-1-i] { return false } } return true }