主頁 >  其他 > Python資料結構:BF演算法、匹配括號、回文鏈表、生成螺旋矩陣、移除串列元素、計算后綴運算式的值、順時針旋轉n維矩陣90度、折半查找

Python資料結構:BF演算法、匹配括號、回文鏈表、生成螺旋矩陣、移除串列元素、計算后綴運算式的值、順時針旋轉n維矩陣90度、折半查找

2022-01-02 08:33:49 其他

目錄

BF演算法匹配字串

匹配括號

回文鏈表

生成螺旋矩陣

移除串列元素

計算后綴運算式的值

順時針旋轉n維矩陣90度

折半查找


BF演算法匹配字串

BF演算法:通過模式串T,與目標串S匹配,查找S中是否存在模式串T;

實作思路:通過目標串S的下標取出元素與模式串下標取出元素進行依次比較,如果發生不匹配,則模式串的下標歸零,目標串S指向下一個索引,

要求:輸出匹配目標串的第一個下標位,不匹配輸出-1

代碼:

def bf(st, tem):
    i = j = 0
    while i < len(st) and j < len(tem):
        if st[i] == tem[j]:
            j += 1
        else:
            j = 0
        i += 1
    if j == len(tem):
        return i - len(tem)
    else:
        return -1


if __name__ == '__main__':
    print(bf('asdfasdx', 'dx'))

結果:

匹配括號

匹配括號:輸入小括號,中括號,大括號,判斷是否匹配

實作思路:先定義一個字典存盤括號,以后括號為鍵“),],}”,前括號為值“(,[,{”,再把鍵和值分別放入到新的串列中存盤,使用堆疊的思想來匹配,通過下標取出的括號串的每一個元素,判斷是鍵還是值,如果是值,也就是前括號,則進堆疊,如果是鍵則判斷當前堆疊頂元素是否與之匹配,不匹配直接結束程式,

代碼:

def match(s):
    assert len(s) > 0
    b = {')': '(', ']': '[', '}': '{'}
    k = b.keys()
    v = b.values()
    l = []
    for i in s:
        if i in v:
            l.append(i)
        elif i in k:
            if len(l) == 0 or l[-1] is not b.get(i):
                return False
            l.pop()
    return len(l) == 0


if __name__ == '__main__':
    print(match(input()))

結果:

回文鏈表

回文單鏈表:回文,12321則為回文,正讀倒讀都一樣,判斷鏈表是否是回文的,首先找到單鏈表的中點,獲取中點采用快慢指標法,慢指標移動1格,快指標移動2格,當快指標到最大索引時,慢指標剛好到中點,把單鏈表的后半段逆置,再與前半段進行比較即可,

要求:輸入字串,中間使用一個空格間隔,轉換為單鏈表,判斷是否是回文鏈表

代碼:

class LinkNode:
    def __init__(self, d):
        self.data = d,
        self.next = None


def get_l(s):
    s = list(map(int, s.split(" ")))
    l = LinkNode(0)
    p = l  # 參考傳遞
    for i in range(len(s)):
        p.next = LinkNode(s[i])
        p = p.next
    return l.next


def palindrom(l):
    if l is None:
        return True;
    s = f = l
    while f.next is not None and f.next.next is not None:
        s = s.next
        f = f.next.next
    h = s.next
    q = reverser(h)
    s.next = None
    p = l
    while p is not None and q is not None:  # p和q都能為空,q為慷訓圈完畢
        if p.data == q.data:
            p, q = p.next, q.next
        else:
            return False
    if q is None:  # q為空說明回圈完畢了,說明匹配了
        return True
    return False


# 逆置鏈表
def reverser(h):
    l = LinkNode(0)
    p = h
    while p is not None:
        x = p.next  # 保存當前項的指向
        p.next = l.next  # 當前項指向頭結點的指向
        l.next = p  # 當前項指向頭結點指向
        p = x
    return l.next


if __name__ == '__main__':
    l = get_l(input())
    print(palindrom(l))

結果:

生成螺旋矩陣

螺旋矩陣:[1,2,3],[8,9,4],[7,6,5]

代碼

#生成螺旋矩陣,如下
# [1,2,3]
# [8,9,4]
# [7,6,5]
def spiral(n):
    matrix = [[0] * n for _ in range(n)]
    # 順時針方向(右,下,左,上)
    dx = [0, 1, 0, -1]
    dy = [1, 0, -1, 0]
    x = y = 0
    dn = 0  # 方向指標0;向右填充,1:向下填充,2:向上填充,3:向上填充

    for i in range(1, n * n + 1):  # 從1開始賦值,一直到n*n
        matrix[x][y] = i
        temp_x = x + dx[dn]
        temp_y = y + dy[dn]
        if 0 <= temp_x < n and 0 <= temp_y < n and matrix[temp_x][temp_y] == 0:
            x = temp_x
            y = temp_y
        else:
            dn = (dn + 1) % 4
            x += dx[dn]
            y += dy[dn]

    return matrix



if __name__ == '__main__':
    n = int(input("輸入矩陣n值:"))
    matrix = spiral(n)
    for i in range(n):
        print(matrix[i])

結果

移除串列元素

代碼:

# 輸入一個串列lt,判斷val是否在lt中,如果在,將其洗掉,最后輸出洗掉后的lt和lt的長度

def remove_element(lt, val):
    k = 0
    for i in range(len(lt)):
        if lt[i] != val:
            lt[k] = lt[i]
            k += 1
    return k


if __name__ == '__main__':
    lt = list(map(int, input().split(' ')))
    val = int(input())
    k = remove_element(lt, val)
    print(k)  # 移除后的元素長度
    print(' '.join(map(str, lt[:k])))  # 輸出移除后的新串列: lt[:k],從0開始截取,截取k位

結果:

計算后綴運算式的值

代碼:

def get_value(lt):
    op = []
    i = 0
    while i < len(lt):
        opv = lt[i]
        if opv == "-":
            a, b = op.pop(), op.pop()
            op.append(b - a)
        elif opv == "+":
            a, b = op.pop(), op.pop()
            op.append(a + b)
        elif opv == "*":
            a, b = op.pop(), op.pop()
            op.append(a * b)
        elif opv == "/":
            a, b = op.pop(), op.pop()
            op.append(b / a)
        else:
            op.append(lt[i])
        i += 1
    else:
        return op[-1]


if __name__ == '__main__':
    lt = [56, 20, '-', 4, 2, '+', '/']
    print(get_value(lt))

結果:

順時針旋轉n維矩陣90度

把n維矩陣順時針旋轉90度

代碼:

# 先對角線交換,再垂直交換
# [[2,3,4],
# [5,6,7],
# [8,9,1]]
# 翻轉90度為
# [[8,5,2],
# [9,6,3],
# [1,7,4]]
# 1先對角線翻轉為
# [[2,5,8],
# [3,6,9],
# [4,7,1]]
# 2再水平翻轉
# [[8,5,2],
# [9,6,3],
# [1,7,4]]
# 4*4
# [[8,5,2,9],
#  [9,6,3,8],
#  [1,7,4,4],
#  [1,7,4,4]]

# 幾層矩陣值,矩陣
def rotatin(n, matrix):
    mat = matrix
    # 對角線翻轉
    # 0,0 0,1<=>1,0 0,2<=>2,0
    for i in range(n):
        for j in range(n - i):
            mat[i][j + i], mat[j + i][i] = mat[j + i][i], mat[i][j + i]
    # 水平翻轉
    for x in range(n):
        for y in range(n // 2):  # 第一個與倒數第一個交換
            mat[x][y], mat[x][-y - 1] = mat[x][-y - 1], mat[x][y]
    return mat


if __name__ == '__main__':
    n = int(input("輸入矩陣數:"))
    # matrix = [[2, 3, 4],
    #           [5, 6, 7],
    #           [8, 9, 1]]
    matrix = []
    for i in range(n):
        lt = list(map(int, input("第" + str(i + 1) + "行矩陣:").split(" ")))
        matrix.append(lt)
    matr = rotatin(n, matrix)
    for i in range(n):
        for j in range(n):
            if j == n - 1:
                print(matr[i][j], end="")
            else:
                print(matr[i][j], end="  ")
        print()

結果:

折半查找

折半查找:找出中點值(使用low=0和hight=n-1組成一個區間),判斷查詢值比中點索引值大還是小,如果小,則把高指標移動到low~mid這個區間里,再進行判斷,重復進行即可,

要求:輸出差查找到的位置,找不到輸出-1

代碼

# 折半查找
def BinSearch(R, k):
    n = len(R)
    low, high = 0, n - 1
    while low <= high:
        mid = (low + high) // 2
        if k == R[mid]:
            return mid
        if k < R[mid]:
            high = mid - 1
        else:
            low = mid + 1
    return -1


if __name__ == '__main__':
    x = list(map(int, input().split(" ")))
    print(BinSearch(x, 3))

結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/400558.html

標籤:其他

上一篇:java 中 List集合子類特點

下一篇:疫情封校,在宿舍學習資料結構——堆疊(Stack)詳解(實體代碼&&各介面代碼)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more