python每日經典演算法題5(基礎題)+1(較難題)

来源:https://www.cnblogs.com/ITXiaoAng/archive/2019/09/14/11517982.html
-Advertisement-
Play Games

一:基礎演算法題5道 1.阿姆斯特朗數 如果一個n位正整數等於其各位數字的n次方之和,則稱該數為阿姆斯特朗數。判斷用戶輸入的數字是否為阿姆斯特朗數。 (1)題目分析:這裡要先得到該數是多少位的,然後再把每一位的數字截取出來,把各位數字的n次方之和和該數一起判斷即可。(2)演算法分析:python中有le ...


一:基礎演算法題5道

1.阿姆斯特朗數

如果一個n位正整數等於其各位數字的n次方之和,則稱該數為阿姆斯特朗數。判斷用戶輸入的數字是否為阿姆斯特朗數。

(1)題目分析:這裡要先得到該數是多少位的,然後再把每一位的數字截取出來,把各位數字的n次方之和和該數一起判斷即可
(2)演算法分析:python中有len()函數可以得到一個字元串的長度,因此需要先把一個正整數轉化為正整數字元串。然後從高位向低位截取(也可以反過來)。或者高效演算法利用for迴圈切片。

從高位到低位:用正整數除了10的n次方,得到的商就是高位的數,餘數就是下次迴圈的數。

從低位到高位:用正整數除以10,得到的餘數就是低位的數,商就是下次迴圈的數。

for迴圈:用for迴圈依次得到每一位數。就是可迭代對象依次顯示。

(3)用到的python語法:while迴圈,for迴圈,if語句,函數。

(4)博主答題代碼:

從高位到低位:

def judge(num):
    mysum = 0
    n = len(str(num)) - 1
    m = n + 1
    firstNum = num
    while num > 0:
        quotient = num //  (10**n)
        remainder = num % (10**n)
        mysum += quotient ** m
        num = remainder
        n -= 1
    if mysum == firstNum:
        print('該數是阿姆斯特朗數')
    else:
        print('該數不是阿姆斯特朗數')


num = int(input('請輸入一個整數:'))
judge(num)

從低位到高位:

def judge(num):
    mysum = 0
    n = len(str(num)) - 1
    m = n + 1
    firstNum = num
    while num > 0:
        quotient = num // 10
        remainder = num % 10
        mysum += remainder ** m
        num = quotient
        n -= 1
    if mysum == firstNum:
        print('該數是阿姆斯特朗數')
    else:
        print('該數不是阿姆斯特朗數')


num = int(input('請輸入一個整數:'))
judge(num)

(5)高效方法:

for迴圈:

def judge(num):
    n = len(num)
    sum = 0
    for i in num:
        sum += int(i) ** n
    if sum == int(num):
        print('該數是阿姆斯特朗數')
    else:
        print('該數不是阿姆斯特朗數')


num = input('請輸入一個整數:')
judge(num)

 

 

2.整數數組

給定一個整數數組,判斷是否存在重覆元素。

(1)題目分析:利用list的內置函數count計算每一個元素的數量,時間會很多,內置函數list.count(i)時間複雜度為O(n) 外面嵌套一層迴圈,總的時間為O(n^2),不是一個高效演算法。

可以排序後對相鄰元素判斷是否相等。還有一個方法是利用set()特性進行判斷。

(2)演算法分析:根據上面的題目分析用高效一點的演算法展示。
(3)用到的python語法:
(4)博主答題代碼:

def judgeInt(num):
    this_set = set(num)
    if len(this_set) == len(num):
        print('沒有重覆')
    else:
        print('有重覆')


my_num = input('請輸入一個整數:')
judgeInt(my_num)

 

 

3.迴文數

判斷一個整數是否是迴文數。

(1)題目分析:迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數

(2)演算法分析:可以利用python的切片很方便地解決該問題,但是如果是其它語言的話,沒有切片。因此需要考慮普遍的方法

演算法分析如下:

可以看到,我們根據兩種不同情況分析,即可得結果。

(3)用到的python語法:if判斷語句,切片,函數。
(4)博主答題代碼:

def judge(x):
    this_str = str(x)
    if len(this_str) % 2 != 0:    
        mid = int((len(this_str) + 1 ) / 2 - 1)
        left = mid - 1
        right = mid
        if this_str[0:left+1] == this_str[-1:right:-1]:
            return True
        else:
            return False

    if len(this_str) % 2 == 0:
        mid = int(len(this_str)/2) - 1
        if this_str[0:mid+1] == this_str[-1:mid:-1]:
            return True
        else:
            return False


num = input('請輸入一個整數:')
if judge(num):
    print('{0}是迴文數'.format(num))
else:
    print('{0}不是迴文數'.format(num))

(5)高效方法:

def judge(x):
    return str(x) == str(x)[::-1]


num = input('請輸入一個整數:')
if judge(num):
    print('{0}是迴文數'.format(num))
else:
    print('{0}不是迴文數'.format(num))

只需要一行代碼即可以判斷,這就是切片的好處。

是不是很簡單呢。

 

 

4.迴文數進階演算法,不限轉化為字元串

       那有沒有什麼不需要先轉化為字元串的方法呢?也是有的。可以利用前面的阿姆斯特朗數從高位到低位和從低位到高位獲取兩個列表或者字典進行比較,這裡就不分析了,直接上代碼:

def judge(num1):
    if '-' in str(num1):
        return False
    if num1 >= 0 and num1 < 10 :
        return True
    list1 = [];list2 = []
    num2 = num1
    n1 = len(str(num1)) - 1
    n2 = len(str(num2)) - 1

    while num1 > 0:
        quotient1 = num1 //  (10**n1)
        remainder1 = num1 % (10**n1)
        list1.append(quotient1)
        num1 = remainder1
        n1 -= 1

    while num2 > 0:
        quotient2 = num2 // 10
        remainder2 = num2 % 10
        list2.append(remainder2)
        num2 = quotient2
        n2 -= 1
    num = 0
    for i in range(0,len(list1)):
        if list2[i] == list1[i]:
            num += 1
    if num == len(list1):
        return True
    else:
        return False


num = int(input('請輸入一個整數:'))
if judge(num):
    print('{0}是迴文數'.format(num))
else:
    print('{0}不是迴文數'.format(num))

效率確實很低。

 

 

5.插入排序

 對於未排序數組,在已排序序列中從前向後或從後向前掃描,找到相應位置並插入。

(1)題目分析:這是個簡單的演算法,只需要把要每個元素依次和相鄰的元素比較即可

(2)演算法分析:想用一個變數標記遍歷到的元素,然後,有兩種方法。

從後先前,把該元素和左邊的元素進行對比,如果比左邊的元素小,就互換,當左邊的元素的編號為-1時停止。

從前先後,把該元素和右邊的元素進行對比,如果比右邊的元素大,就互換,當右邊的元素的編號為數組的長度減1時停止。

(3)用到的python語法:while迴圈,函數,數據交換。

(4)博主答題代碼:

def insert(arr):    
    for i in range(1,len(arr)):
        j = i
        while j > 0:
            if arr[j] < arr[j-1]:
                arr[j-1],arr[j] = arr[j],arr[j-1]
            j -= 1        


my_arr = list(map(int,input('請輸入數組:').split(',')))
insert(my_arr)
print(my_arr)

(5)高效代碼

用python的列表排序函數sort()可以很方便進行排序。

 

二:較難演算法題1道

這些等到下一篇博客會詳細講解。

1.串聯所有單詞的字串

給定一個字元串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。

註意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。

 

2.解數獨

編寫一個程式,通過已填充的空格來解決數獨問題。

空白格用 '.' 表示。

 

較難演算法題等到之後博客會詳細講解。


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

-Advertisement-
Play Games
更多相關文章
  • Socket(套接字) 套接字是一個抽象層,應用程式可以通過它發送或接收數據,可對其進行像文件一樣的打開、讀寫和關閉等操作。套接字允許應用程式將I/O插入到網路中,並與網路中的其他應用程式進行通信。網路套接字是IP地址與埠的組合。 發展:套接字最初是由加利福尼亞大學Berkely分校為Unix系統 ...
  • 元組與列表區別 1. Python 元組與列表類似,不同之處在於列表可以修改,元組不可以修改 2. 元組用小括弧 定義,列表用方括弧 定義 3. 元組不可修改,列表可修改 元組創建 只需要在小括弧 內添加內容並用逗號 分隔開,如下示例 註意: 當元組只有一個元素時,需要在元素後面添加都要 如果不在後 ...
  • 程式演算法與人生選擇 我用演算法來類比如何做選擇,說白了就是怎麼去計算,但是並沒有講程式員可以發展的方向有哪些。 所以,就算是有這些所謂的方法論,我們可能對自己的發展還是會很糾結和無所事從,尤其是人到了30歲,這種彷徨和迷惑越來越重。雖然我之前也寫過一篇《編程年齡和編程技能》的文章,但是還是有很多做技術 ...
  • 1.為 Python 2 安裝 pip 首先,確保已經安裝了 Python 2。 在 Ubuntu 上,可以使用以下命令進行驗證 如果沒有錯誤並且顯示了 Python 版本的有效輸出,則說明安裝了 Python 2。 所以現在你可以使用這個命令為 Python 2 安裝 pip: 這將安裝 pip ...
  • busuanzi計數腳本 busuanzi官方指引 一、安裝腳本(必選) 要使用不蒜子必須在頁面中引入busuanzi.js,目前最新版如下。 不蒜子可以給任何類型的個人站點使用,如果你是用的hexo,打開themes/你的主題/layout/_partial/footer.ejs添加上述腳本即可, ...
  • 為什麼要抽模板,因為這樣能夠復用代碼,減少代碼量,需要原代碼時就不需要修改,也不需要添加; 如果不同,就只需要單獨修改不一樣的地方就行 : 多挖坑,少代碼,這就是抽模板的精髓,挖坑就是({% block xxx %}需要改變的代碼{% endblock %}) 靜態頁面抽取模板 一、分析靜態頁面 1 ...
  • 一、起因 從《大型網站架構系列》到《架構師入門實踐》,一直想把代碼設計和架構的知識進行總結,但是苦於精力和能力有限,推動起來比較緩慢。也多次收到出版社的邀請,但遲遲沒有動筆。偶爾也會糾結做視頻還是寫文章,考慮到業餘寫作和工作之間的平衡,還是先以文章為主吧。寫出來和大家交流,算是自己的一個知識總結,如 ...
  • MVC模式 在講解Servlet前,先介紹一下MVC模式。 M:model 模型,相當於數據層,用於存放數據,如一個Java中的一個bean類 V:view 視圖,相當於頁面層,用於顯示數據,如一個網頁html,或者是jsp C: controller 控制器,相當於業務層,用於處理數據 我們之前使 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...