Tác giả: Lê Trung Kiên lớp java 08
Email: lekien.2803.cg@gmail.com
SĐT: 0942096947
Link bài toán: https://leetcode.com/problems/subtract-the-product-and-sum-of-digits-of-an-integer/

1. Mở đầu

Xin chào các bạn, mình viết ra bài viết này để chia sẻ phương pháp giải cũng như tư duy của mình về bài toán này của leetcode. Phương pháp của mình có thể không phải là tối ưu nhất, tuy nhiên mình sẽ phân tích, chia nhỏ bài toán ra thành các module nhỏ hơn để dễ giải quyết cũng như giúp các bạn hiểu được các yêu cầu mà bài toán đưa ra.

2. Đề bài

Cho một số nguyên n, trả về kết quả là hiệu giữa tích các chữ số và tổng các chữ số của n.
Điều kiện:

  • 1 <= n <= 10^5.

Bài toán minh họa 1:

Input: n = 234
Output: 15 
Explanation: 
Product of digits = 2 * 3 * 4 = 24 
Sum of digits = 2 + 3 + 4 = 9 
Result = 24 - 9 = 15

Bài toán minh họa 2:

Input: n = 4421
Output: 21
Explanation: 
Product of digits = 4 * 4 * 2 * 1 = 32 
Sum of digits = 4 + 4 + 2 + 1 = 11 
Result = 32 - 11 = 21

3. Phân tích

Ố kè, bài này cũng không quá phức tạp. Họ cho ta một số nguyên n, yêu cầu ta tính tổng các chữ số, tính tích các chữ số, sau đó lấy tích trừ đi tổng để ra được kết quả đề bài yêu cầu. Vậy chúng ta cần làm những gì?

  • Công việc đầu tiên chúng ta cần làm đó chính là lấy được hết các chữ số của n, rồi cho nó vào trong một mảng.
  • Sau khi lấy được hết các chữ số rồi thì chỉ việc tính tổng và tích các chữ số đó thôi, tính xong thì lấy tích trừ tổng.

Thế là xong! Tới bước tiếp theo thôi

4. Code chạy bằng cơm

Đầu tiên, chúng ta cần tạo ra một mảng số nguyên digits chứa các chữ số của số nguyên n. Và kích thước của mảng digits này tất nhiên là bằng các chữ số xuất hiện trong n rồi. Tuy nhiên, làm thế nào để biết được số nguyên n có bao nhiêu chữ số? Chúng ta sẽ phải biến số n này về dạng String, sau đó dùng method length() của class String để biết được n có bao nhiêu chữ số:
leetcode-1281-1

Tiếp theo, chúng ta cần bóc tách lấy từng chữ số của n để cho vào trong mảng digits. Vậy làm thế nào để lấy từng chữ số?
Mình có một bài hướng dẫn cũng có công việc lấy từng chữ số của một số nguyên, các bạn có thể vào đây để tham khảo.
Để có thể lấy được từng chữ số của n, ta sẽ lấy tuần tự từ chữ số hàng đơn vị dần dần đến chữ số hàng lớn nhất của n. Chúng ta cần vòng lặp while để làm việc này, trong đó ta sẽ đặt n % 10, với phép chia lấy dư % 10, ta sẽ luôn lấy được chữ số cuối cùng của số đó. Sau khi lấy được chữ số cuối cùng hiện có của n, ta đặt phép tính n /10 để n mất đi chữ số ta vừa lấy, qua vòng lặp sau ta sẽ lấy được chữ số cuối cùng tiếp theo:
leetcode-1281-2

Giờ chúng ta đã có mảng digits như thế này:
leetcode-1281-3

Sau đó, chúng ta cần hai biến product là tích các chữ số và sum là tổng các chữ số. Với product = 1sum = 0 . Tại sao lại là 10? Bởi vì bất cứ số nào nhân với 1 sẽ bằng chính nó và bất cứ số nào cộng với 0 cũng bằng chính nó. Chứ product mà bằng 0 thì tích các chữ số tính ra bằng 0 hết.
leetcode-1281-4

Cuối cùng chúng ta làm một vòng lặp for qua mảng digits, lấy từng phần tử cộng dồn với sum và nhân dồn với product. Sau đó lấy product - sum là ra kết quả phải trả về. Easy peasy lemon squeezy!
leetcode-1281-5

Done! Tới bước tiếp theo thôi các bạn ơi!

5. Code chạy bằng máy

Code của chúng ta sẽ như sau:

 public static int subtractProductAndSum(int n) {
     int product = 1, sum = 0;
     int len = String.valueOf(n).length();
     int[] digits = new int[len];
     int i = 0;

     while (i <= len - 1) {
         digits[i++] = n % 10;
         n /= 10;
     }

     for (int d : digits) {
         product *= d;
         sum += d;
     }

     return product - sum;
 }

6. Kết thúc

Qua bài viết này, mình đã chia sẻ cho các bạn cách mình tư duy khi giải bài tập trên leetcode. Hi vọng bài viết giúp ích cho các bạn trong cách tư duy để giải các bài tập khác. Xin cám ơn các bạn đã dành thời gian đọc và theo dõi. Peace!!!