Как проверить, является ли число палиндромом?

Как подробно описано в коде комментария ниже, ваш журнал находится после вашего возвращения и поэтому никогда не будет выполнен.

Также вы не использовали await в асинхронной функции, поэтому либо не делайте ее асинхронной, либо используйте await.

csv.upsert = async function (values, condition) {
    const obj = await csv.findOne({ where: condition });
    // you can await here, no need for then as you are in an async function

    if (obj) { // update
        // you need to log before your return condition
        console.log("existing record updated")
        return obj.update(values);
        // since we return here, the rest of the code will not be executed
        // you can skip the use of else
    }
    // we are in this part of the code only if object is falsy

    // insert
    console.log("new record inserted")
    return csv.create(values);
}

Вы также можете использовать Promise.all, чтобы убедиться, что все upsert выполнены:

await Promise.all(dataToBeInserted.map(async function (data) {
    let condition = {
        'categorygroup': data.categorygroup,
        'category': data.category,
        'country': data.country,
        'city': data.city
    };
    await csvModel.upsert(data, condition);
}))

это также гарантирует, что в случае возникновения ошибки она будет перехвачена вашим try / catch

Может быть, это поможет вам найти причину неожиданного поведения.

121
задан bjb568 2 November 2014 в 22:36
поделиться

9 ответов

Это - одна из Euler проблем Проекта. Когда я решил его в Haskell, я сделал точно, что Вы предлагаете, преобразовываете число в Строку. Это затем тривиально, чтобы проверить, что строка является палиндромом. Если это работает достаточно хорошо, то почему беспокойство, делающее это более сложный? Быть палиндромом является лексическим свойством, а не математическим.

125
ответ дан 24 November 2019 в 01:26
поделиться

Для любого данного числа:

n = num;
rev = 0;
while (num > 0)
{
    dig = num % 10;
    rev = rev * 10 + dig;
    num = num / 10;
}

Если n == rev затем num палиндром:

cout << "Number " << (n == rev ? "IS" : "IS NOT") << " a palindrome" << endl;
265
ответ дан 24 November 2019 в 01:26
поделиться
int is_palindrome(unsigned long orig)
{
    unsigned long reversed = 0, n = orig;

    while (n > 0)
    {
        reversed = reversed * 10 + n % 10;
        n /= 10;
    }

    return orig == reversed;
}
14
ответ дан 24 November 2019 в 01:26
поделиться
def ReverseNumber(n, partial=0):
    if n == 0:
        return partial
    return ReverseNumber(n // 10, partial * 10 + n % 10)

trial = 123454321
if ReverseNumber(trial) == trial:
    print("It's a Palindrome!")

Работы для целых чисел только. Неясно от проблемного оператора, если числа с плавающей точкой или начальные нули нужно рассмотреть.

24
ответ дан 24 November 2019 в 01:26
поделиться

Только для забавы, этот также работает.

a = num;
b = 0;
if (a % 10 == 0)
  return a == 0;
do {
  b = 10 * b + a % 10;
  if (a == b)
    return true;
  a = a / 10;
} while (a > b);
return a == b;
5
ответ дан 24 November 2019 в 01:26
поделиться

Продвиньте каждую отдельную цифру на стек, затем вытолкайте их прочь. Если это - те же форварды и назад, это - палиндром.

9
ответ дан 24 November 2019 в 01:26
поделиться

Поп от первых и последних цифр и сравнивает их, пока Вы не выбегаете. Может быть цифра, оставленная, или нет, но так или иначе, если весь вытолканный от соответствия цифр, это - палиндром.

2
ответ дан 24 November 2019 в 01:26
поделиться

Я ответил на Euler проблему с помощью очень грубого-forcy пути. Естественно, был намного более умный алгоритм в дисплее, когда я добрался до нового разблокированного связанного потока форума. А именно, у участника, который прошел мимо дескриптора Begoner, был такой новый подход, что я решил повторно реализовать свое решение с помощью его алгоритма. Его версия была в Python (использующий вложенные циклы), и я повторно реализовал его в Clojure (использующий сингл, циклично выполняются/повторяются).

Здесь для Вашего развлечения:

(defn palindrome? [n]
  (let [len (count n)]
    (and
      (= (first n) (last n))
      (or (>= 1 (count n))
        (palindrome? (. n (substring 1 (dec len))))))))

(defn begoners-palindrome []
  (loop [mx 0
         mxI 0
         mxJ 0
         i 999
         j 990]
    (if (> i 100)
      (let [product (* i j)]
        (if (and (> product mx) (palindrome? (str product)))
          (recur product i j
            (if (> j 100) i (dec i))
            (if (> j 100) (- j 11) 990))
          (recur mx mxI mxJ
            (if (> j 100) i (dec i))
            (if (> j 100) (- j 11) 990))))
      mx)))

(time (prn (begoners-palindrome)))

Также были ответы языка Common LISP, но они были ungrokable мне.

4
ответ дан 24 November 2019 в 01:26
поделиться

Вот версия схемы, которая создает функцию, которая будет работать с любой базой. У него есть проверка на избыточность: быстро вернуть false, если число кратно основному (заканчивается на 0).
И он восстанавливает не все перевернутое число, а только половину.
Это все, что нам нужно.

(define make-palindrome-tester
   (lambda (base)
     (lambda (n)
       (cond
         ((= 0 (modulo n base)) #f)
         (else
          (letrec
              ((Q (lambda (h t)
                    (cond
                      ((< h t) #f)
                      ((= h t) #t)
                      (else
                       (let*
                           ((h2 (quotient h base))
                            (m  (- h (* h2 base))))
                         (cond
                           ((= h2 t) #t)
                           (else
                            (Q h2 (+ (* base t) m))))))))))
            (Q n 0)))))))
4
ответ дан 24 November 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: