每日演算法之醜數

来源:https://www.cnblogs.com/loongnuts/archive/2022/12/21/16995651.html
-Advertisement-
Play Games

JZ49 醜數 題目 我們先看到題目,把只包含質因數2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因數7。 習慣上我們把1當做是第一個醜數。 方法1:質因數分解(暴力) 思路 演算法實現 一個很朴素的做法 從1~n每次+1,一直枚舉,直到找到地N個醜數為 ...


JZ49 醜數

題目

我們先看到題目,把只包含質因數2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因數7。 習慣上我們把1當做是第一個醜數。

方法1:質因數分解(暴力)

思路

演算法實現

  • 一個很朴素的做法
  • 從1~n每次+1,一直枚舉,直到找到地N個醜數為止
  • 那麼還有一個待解決的問題,如何判斷當前數字是不是醜數呢?
  • 我們總結一下醜數的性質:只能分解為2,3,5的如乾次冪相乘的數,即設第個醜數為,則 res = 2*x + 3*y + 5*z
  • 那麼我們只需要通過質因數分解,判斷他分解2,3,5後,是否為1,如果為1,則說明沒有其他的因數,否則則有其他因數,那麼他就不是一個醜數

問題
當輸入數過大時,需要的時間會很長,所以此方法不行

代碼

package mid.JZ49醜數;

import java.util.ArrayList;

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        int current = 1;
        ArrayList<Integer> res = new ArrayList<>();
        res.add(1);
        while(true) {
            if (res.size() == index) {
                return res.get(res.size() - 1);
            }

            current++;

            if (check(current)) {
                res.add(current);
            }
        }
    }
    public boolean check(int num) {
        while(num % 2 == 0) num /= 2;
        while(num % 3 == 0) num /= 3;
        while(num % 5 == 0) num /= 5;
        return num == 1;
    }

    public static void main(String[] args) {
        System.out.println(new Solution().GetUglyNumber_Solution(1500));
    }
}

方法2

思路

  • 有了上面的定義我們就可以知道,醜數的形式就是2x3y5z,所以我們可以定義一個數組res,存儲第n個醜數。
  • 因為我們要將醜數按從小到大的順序排序,所以我們就得將對應的醜數放在對應的下標位置,小的放前面。
  • 這個時候上面我們的出來的醜數的格式就起作用了,醜數的形式無非就是這樣2x3y5z,所以我們就將res[n]去乘以 2、3、5,然後比較出最小的那個,就是我們當前的下一個醜數了。

代碼

package mid.JZ49醜數;

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if (index <= 6) return index;
        int x = 0, y = 0, z = 0;
        int[] res = new int[index];

        res[0] = 1;

        for (int i = 1; i < index; i++) {
            res[i] = Math.min(res[x]*2, Math.min(res[y]*3, res[z]*5));

            if (res[i] == res[x]*2) x++;
            if (res[i] == res[y]*3) y++;
            if (res[i] == res[z]*5) z++;
        }

        return res[index - 1];
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris." - Larry Wall “程式員的美德:懶惰,不耐煩 ...
  • 摘要:Java是如何實現和管理線程池的? 本文分享自華為雲社區《JUC線程池: ThreadPoolExecutor詳解》,作者:龍哥手記 。 帶著大廠的面試問題去理解 提示 請帶著這些問題繼續後文,會很大程度上幫助你更好的理解相關知識點。@pdai 為什麼要有線程池? Java是實現和管理線程池有 ...
  • 整理一下常用的代碼,可以支持後續的直接拿過來使用,不需要慢慢再去百度搜索了, 後續不間斷更新 1.List轉List 將一個類型的List轉為另一個類型的List 1 public static void main(String[] args) { 2 List<TbUser> userList = ...
  • 一、從java類載入機制說起 java中的類載入器負載載入來自文件系統、網路或者其他來源的類文件。jvm的類載入器預設使用的是雙親委派模式。三種預設的類載入器Bootstrap ClassLoader、Extension ClassLoader和System ClassLoader(Applicat ...
  • 1. 註解基本概念 註解,什麼是註解? 打開百度搜索 好,看不懂 沒關係 一步一步慢慢來 先不管註解,註釋這個概念應該就很熟悉了,文檔註釋,單行註釋,多行註釋 註釋是對一段程式,一個方法,一個類進行描述,是給我們程式員看的,都知道,註解是不會被編譯的,會被忽略 註解,同樣的道理,其實就是用來說明代碼 ...
  • 本文介紹了 Parquet 和 Feather 兩種文件類型,可以提高本地存儲數據時的讀寫速度,並壓縮存儲在磁碟上的數據大小。大型 CSV 文件的剋星!用起來~ ...
  • 前文再續,上一回我們完成了用戶的登錄邏輯,將之前用戶管理模塊中添加的用戶賬號進行賬號和密碼的校驗,過程中使用圖形驗證碼強制進行人機交互,防止賬號的密碼被暴力破解。本回我們需要為登錄成功的用戶生成Token,並且通過Iris的中間件(Middleware)進行鑒權操作。 Iris模板復用 在生成Tok ...
  • redis 是一種非關係型資料庫,什麼是非關係型資料庫,之前我們在mysql專欄 也有提到過,這邊就不再過多的贅述,忘記了的小伙伴可以再次閱讀這篇文章 終於明白了資料庫的【關係型】與【非關係型】 其實這還是挺重要的,上次我們有個初級程式員來面試,我作為旁聽,主考官就問了關係型資料庫跟非關係型資料庫, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...