Определить доминирующий элемент списка (с частотй более 50%) - Lisp

Узнай цену своей работы

Формулировка задачи:

Мое решение:
(defun dominate (lst &optional (res nil) (l (length lst)))
  (cond ((null lst) (caar (remove-if #'(lambda (x) (< (cadr x) (* 0.5 l))) res)))
        (t (let* ((a (car lst))
                  (lstn (remove a lst))
                  (ll (length lstn)))
            (dominate lstn (cons (list a (- (length lst) (length lstn))) res) l)))))
 
==> dominate
 
(dominate '(1 2 3 3 3 1 3 3 2))
 
==> 3
 
(dominate '(1 2 3 1 2 3))
 
==> NIL

Решение задачи: «Определить доминирующий элемент списка (с частотй более 50%)»

textual
Листинг программы
(defun dominate (lst)
 (let ((h (gensym 'h)) (n 0) (r nil))
   (hashCreate h)
   (iter (for a in lst)
    (counting a into n) 
    (if (hashKeyExist h a) 
        (setf (hashGet h a) (+ 1 (car (hashGet h a))))
        (hashPut h a 1)))
    (hashMap h #'(lambda (k v) (when (> v (* 0.5 n)) (push k r))))
    (hashDestroy h)
    r))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы