Vu Minh Tien
Technical / Language / Lifestyle

Technical / Language / Lifestyle

#2: Codesignal: adjacentElementsProduct

Photo by Bram Naus on Unsplash

#2: Codesignal: adjacentElementsProduct

Vu Minh Tien's photo
Vu Minh Tien
·Apr 7, 2022·

3 min read

Subscribe to my newsletter and never miss my upcoming articles

Table of contents

  • Phân tích yêu cầu

Hè lố, xin chào các bợn, mình là Tiến, hôm nay mình sẽ cùng các bạn tiếp túc chủ đề Problem Solving nha..

Đây là thử thách của mình I will write a post every day

Link thử thách: app.codesignal.com/arcade/intro/level-2/xzK..

Question: Given an array of integers, find the pair of adjacent elements that has the largest product and return that product.

Đề bài: Hiểu đơn giản là cung cấp 1 mảng số tự nhiên(Integer), tính tích cặp giá trị(2 số) liền kề lớn nhất trong mảng.

Ví dụ:

  • Cho mảng [3, 6, -2, -5, 7, 3] ta thấy 7 và 3 là 2 số liền kề có tích lớn nhất = 21.
  • Cho mảng [1, 2, 3, 0] sẽ ra kết quả 62, 3 liền kề nhau và có tích lớn nhất

Phân tích yêu cầu

  1. Phân tách 1 mảng thành các cặp 2 chữ số, không quan tâm số lượng phần tử của mảng là lẻ hay là chẵn

    Ví dụ: [1,2,3,4,5] # mảng lẻ -> chia thành cặp 1-2, 2-3, 3-4, 4-5 -> ta thấy cặp 4, 5 sẽ là cặp có tích lớn nhất = 20 -> Kết quả trả về sẽ là 20.

  2. Tương tự như mảng chẵn chúng ta cũng xử lý như thế

  3. Trường hợp có âm ta vẫn tính tích bình thường Ví dụ: [-23, 4, -3, 8, -12] -> chia thành các cặp như phân tích (1)

    ⇒ Ta sẽ có kết quả -12 là tích lớn nhất (cặp 4 và -3)

Cách 1: Cách đơn giản nhất - Dùng loop

  1. Dùng for để tính từng cặp một rồi push vào 1 mảng kết quả của các cặp tích
  2. Từ mảng lưu giá trị tích của các cặp số, trả về số lớn nhất → Chính là tích lớn nhất
def solution(inputArray)
    result = []
    inputArray.each_with_index do |value, index|
        next if inputArray[index + 1].nil?
        result << value * inputArray[index + 1] if value * inputArray[index + 1]
    end
    result.max
end

Cách 2: Dùng method hỗ trợ, code nhìn đơn giản hơn 1 chút

def solution(inputArray)
    inputArray.each_cons(2).map { |x, y| x * y }.max
end
  1. Dùng .each_cons để tách thành từng cặp số
  2. Dùng .map để trả về mảng mới đã tính tích các cặp số
  3. Dùng .max để tìm ra số lớn nhất trong mảng → Chính là tích lớn nhất

Note: .each_cons là phương thức cho phép tách 1 mảng thành các cặp(N) phần tử theo params chúng ta truyền vào.

[*1..5].each_with_index.to_a
-> Tạo mảng từ 1-10, phân tích thành các khối liên tiếp gồm 3 phần từ
=> [[1, 0], [2, 1], [3, 2], [4, 3], [5, 4]]

Cảm ơn mọi người đã dành thời gian đọc bài viết của mình. Đừng ngại để lại comment để chúng ta có thể tương tác và học tập lẫn nhau nhé!!!

Bạn có thể donate/mời mình 1 cốc cafe để mình có thêm động lực viết thêm các bài chất lượng nha...hí hí

Link donate: https://tienvm.com/donate

❤️ Thank you for reading and see you next posts ❤️

Photo by Bram Naus on Unsplash

Did you find this article valuable?

Support Vu Minh Tien by becoming a sponsor. Any amount is appreciated!

Learn more about Hashnode Sponsors
 
Share this