Trước tiên, tôi sẽ không phát minh lại bánh xe ... phương pháp tối đa đã được quy định tại RichInt
, vì vậy bạn có thể viết a max b
, cho a
và b
số nguyên.
ALso,
slice
không được chấp nhận, do đó
thay vì lst.slice(0, num)
Tôi sẽ sử dụng lst.take(num)
. Các phương thức không được chấp nhận có thể sẽ biến mất khi Scala 2.8 được khởi chạy.
CHỈNH SỬA: Thực tế, như Daniel chỉ ra, slice(Int, Int)
không được dùng nữa. Tôi đã khá vội vàng khi ban đầu tôi viết điều này, và tôi đã nghĩ đến slice(Int)
, tương đương với drop(Int)
. Tôi vẫn tìm thấy số lst.take(num)
để rõ ràng hơn lst.slice(0, num)
:).
(nitpick) Dòng cuối cùng của bạn cũng không biên dịch khi bạn quên thêm Nil
vào cuối chuỗi khuyết điểm của mình. 1::2::3::4
, sẽ kết thúc bằng cách gọi ::
trên số Int
, không có phương pháp này. Đó là lý do tại sao bạn cần phải thêm Nil
vào cuối (gọi số ::
trên Nil
).
Ngoài ra, thuật toán bạn đã sử dụng không rõ ràng ngay từ cái nhìn đầu tiên. Con đường tôi sẽ viết những dòng này là như sau:
val numbers = /*"--the string of numbers--"*/.map(_.asDigit).toList
def sliding[A](xs: List[A], w: Int): List[List[A]] = {
for(n <- List.range(0, xs.size - w))
yield xs drop n take w
}
def product(xs: List[Int]): Int = (1 /: xs) (_ * _)
sliding(numbers, 5).map(product).sort(_ > _).head
Tôi cảm thấy rằng dòng cuối cùng giải thích khá tốt những gì các thuật toán là phải làm - mất một cửa sổ trượt của danh sách, tính toán sản phẩm ở chỗ cửa sổ trượt và sau đó nhận được tối đa các sản phẩm tính toán (tôi đã thực hiện chức năng tối đa là sort(_ > _).head
trong sự lười biếng, tôi có thể làm điều gì đó O (n) thay vì O (n log (n)) nếu hiệu suất là quan trọng ... nó vẫn chạy dưới một giây).
Lưu ý rằng chức năng trượt sẽ nằm trong thư viện Scala 2.8 (xem Daniel's post, từ đó tôi được truyền cảm hứng bằng văn bản định nghĩa trượt này).
EDIT: Rất tiếc ...xin lỗi về số /:
. Tôi chỉ thích sự phù hợp của nó và thực tế là yếu tố ban đầu của màn hình xuất hiện trước danh sách. Bạn có thể viết tương đương product
như sau, để được rõ ràng hơn:
def product(xs: List[Int]): Int = xs.foldLeft(1)(_ * _)
-- Flaviu Cipcigan
Cảm ơn Flaviu, đó là câu trả lời tôi hy vọng. Tôi mất 5 phút để hiểu giải pháp của bạn, chủ yếu là do cú pháp rất súc tích, mà bạn sử dụng. Tôi chưa biết các nhà khai thác, vì vậy một cái gì đó như '1 /: xs' hoàn toàn khó hiểu ngay từ cái nhìn đầu tiên. –
Vui vì tôi có thể giúp. Tôi đã chỉnh sửa bài đăng để cung cấp định nghĩa khó hiểu về sản phẩm;). –
Không được sử dụng 'slice'? Tôi không thấy bất kỳ cảnh báo nào trên 2.8 hoặc 2.7.4. –