每周刷題第三期

個人主頁:星紜-CSDN博客

系列文章專欄:Python

踏上取經路,比抵達靈山更重要!一起努力一起進步!?

目錄

題目一:環形鏈表

題目二:刪除有序數組中的重復項

題目三:有效的括號

題目四:用隊列實現棧

題目五:用棧實現隊列?


題目一:環形鏈表

題目出處:. - 力扣(LeetCode)/

題目描述:這道題和上一期的環形鏈表很像只不過,一個是判斷是否存在環,一個是求入環節點。

題解思路:采用雙指針。定義兩個指針fast,slow,fast一次走兩步,slow一次走一步。

然后我們來分析一下這道題的數學關系。?

相遇點指的是fast指針和slow指針第一次相遇的地方。

當fast和slow相遇的時候,fast行走的距離是slow的兩倍,

slow:L + X

fast:2(L + X) = L + X + a * N。a指的是fast進入環后行走的圈數

L = (a - 1) * N + N - X;

N-X就是相遇點到環的距離。也就是說,如果fast從相遇出發,slow從起點出發,均每次走一步。兩者第一次相遇的地方就是進入環的節點。

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fast = head,*slow = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(fast == slow){fast = head;while(fast != slow){fast = fast->next;slow = slow->next;				}return fast;}}return NULL;
}

題目二:刪除有序數組中的重復項

題目出處:. - 力扣(LeetCode)?

題目描述:給你一個?非嚴格遞增排列?的數組?nums?,請你?原地?刪除重復出現的元素,使每個元素?只出現一次?,返回刪除后數組的新長度。元素的?相對順序?應該保持?一致?。然后返回?nums?中唯一元素的個數。

這道題的要求是,原地刪除,所以空間復雜度是O(1),因為這個數組是非嚴格遞增的,重復的元素是挨在一起的,即相等的元素在數組中一定是連續的。

解題思路:使用雙指針,定義兩個指針src,dst.src表示下一個不同元素的下標,dst表示要填入的位置的下標。

dst開始指向0,src開始指向1.如果src和dst相同,src就加1。不相同,dst加1,然后移動元素,然后src也加1.

int removeDuplicates(int* nums, int numsSize) {int src,dst;src = 1;dst = 0;while(src < numsSize){if(nums[src] != nums[dst]){++dst;nums[dst] = nums[src];++src;}else{src++;}}int k = dst + 1;return k;
}

題目三:有效的括號

題目出處:. - 力扣(LeetCode)

題目描述 :

這個題目的示例不夠全面,?

對于字符串s = "{[]}",這樣的字符串也成立,s = "()[{}]"也是成立的,題目所給的示例會讓人誤以為匹配的括號必須連續,其實不是這樣的,這是題目的一個問題。

題目思路:首先需要用C語言手動實現一個棧。

然后我們開始遍歷整個字符串:當遇到左括號的時候,就入棧,遇到右括號的時候,就取出棧頂元素,進行匹配,如果不匹配說明這個字符串不有效,反之繼續匹配?,直到結束,該字符串就匹配。關于棧的代碼參考前面的文章。

bool isValid(char* s) {Stack st;STInit(&st);while (*s) {if (*s == '(' || *s == '[' || *s == '{') {STPush(&st, *s);} else {if (IsEmpty(&st)) {STDestory(&st);return false;} else {char ch = STTop(&st);STPop(&st);if ((ch == '(' && *s != ')') || (ch == '[' && *s != ']') ||(ch == '{' && *s != '}')) {STDestory(&st);return false;}}}++s;}bool ret = IsEmpty(&st);STDestory(&st);return ret;
}

在每次使用return語句之前都要銷毀這個棧,避免內存泄漏。

最后為什么是返回ret?

如果遇到這樣的字符,不難發現根本沒有進入循環,直接返回了true,這明顯是不正確的,所以需要進行判斷,棧是否為空,如果為空,所以左括號并沒匹配完成,這個字符串無效。

題目四:用隊列實現棧

題目出處:. - 力扣(LeetCode)

題目描述:

請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(pushtoppop?和?empty)。

實現?MyStack?類:

  • void push(int x)?將元素 x 壓入棧頂。
  • int pop()?移除并返回棧頂元素。
  • int top()?返回棧頂元素。
  • boolean empty()?如果棧是空的,返回?true?;否則,返回?false?。

?解題思路:

如果接下來我們要進行出棧,根據先進后出的規則,那么得到的第一個數據應該是5,可是僅僅在隊列一中進行出隊列入隊列是達不到這樣的效果的。

那么如何進行操作呢?

首先我們可以將1-4入隊列到隊列二中,這樣隊列一中就只剩下一個數據5了,此時出隊列就是5.起到了先進后出的效果。如果還需要放入數據,很明顯是放在隊列二中,因為此時的隊列一已經沒有了數據了。

首先需要使用C語言實現一個隊列。代碼參考前面的文章。

初始化:

typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* pst = (MyStack*)malloc(sizeof(MyStack));QueueInit(&(pst->q1));QueueInit(&(pst->q2));return pst;
}

push:


void myStackPush(MyStack* obj, int x) {if (!QueueEmpty(&(obj->q1))) {QueuePush(&(obj->q1), x);} else {QueuePush(&(obj->q2), x);}
}

新放入的數據,需要放在已經存放有數據的隊列。如果兩個隊列都為空,那么此時隨便放在那個隊列中都可以。

刪除數據:

int myStackPop(MyStack* obj) {Queue* noempty = &(obj->q1);Queue* empty = &(obj->q2);if (!QueueEmpty(&(obj->q2))) {noempty = &(obj->q2);empty = &(obj->q1);}while (QueueSize(noempty) > 1) {QueuePush(empty, QueueFront(noempty));QueuePop(noempty);}int top = QueueFront(noempty);QueuePop(noempty);return top;
}

由于不確定,哪一個隊列是空的,所以采用假設法進行判斷,出數據的時候,需要將非空隊列的數據的前n-1個全部轉移到空隊列中,留剩下一個出棧即可。

查看棧頂元素:

int myStackTop(MyStack* obj) {if (!QueueEmpty(&(obj->q2))) {return QueueBack(&(obj->q2));} else {return QueueBack(&(obj->q1));}
}

實現的隊列中是,含有查看隊尾元素的,非空的隊列的隊尾元素就是棧頂元素。?

判空與銷毀:

bool myStackEmpty(MyStack* obj) {return QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2));
}void myStackFree(MyStack* obj) {QueueDestory(&(obj->q1));QueueDestory(&(obj->q2));free(obj);
}

這里的判空,是判斷兩個隊列都是否為空。

題目五:用棧實現隊列?

?題目出處;. - 力扣(LeetCode)

?題目描述:

請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(pushpoppeekempty):

實現?MyQueue?類:

  • void push(int x)?將元素 x 推到隊列的末尾
  • int pop()?從隊列的開頭移除并返回元素
  • int peek()?返回隊列開頭的元素
  • boolean empty()?如果隊列為空,返回?true?;否則,返回?false

解題思路:

這道題與上一道題類似

只不過,需要判斷空了,入棧的時候只需要把?數據固定存放在一個棧中,push棧,出棧的時候,先出pop棧中的數據,如果棧為空,把push棧的數據導過來。

初始化:

typedef struct {ST pushst;ST popst;
} MyQueue;MyQueue* myQueueCreate() {MyQueue*obj = (MyQueue*)malloc(sizeof(MyQueue));STInit(&obj->pushst);STInit(&obj->popst);return obj;
}

入數據:

void myQueuePush(MyQueue* obj, int x) {STPush(&obj->pushst,x);
}

查看數據:

int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){STPush(&obj->popst,STTop(&obj->pushst));STPop(&obj->pushst);}}return STTop(&obj->popst);
}

首先需要判斷popst中是否為空,如果不為空就直接返回即可,為空,就需要向pust中得到數據。

?出數據:

int myQueuePop(MyQueue* obj) {int front = myQueuePeek(obj);STPop(&obj->popst);return front;
}

出數據,直接使用peek函數先查看一下棧頂有沒有元素,有才出,否則peek元素會先導數據。

判空與銷毀:

bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->pushst) && STEmpty(&obj->popst);
}void myQueueFree(MyQueue* obj) {STDestory(&obj->popst);STDestory(&obj->pushst);free(obj);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14402.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14402.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14402.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從左上角到右下角的最小距離和

題目描述&#xff1a;給定一個二維數組matrix&#xff0c;一個人必須從左上角出發&#xff0c;最后到達右下角&#xff0c;沿途只可以向下或者向右走&#xff0c;沿途的數字都累加就是距離累加和&#xff0c;返回最小距離累加和。 way&#xff1a;無他&#xff0c;dp[i] [j]表…

《隊列》

描述 學校體操隊到操場集合&#xff0c;排成每行2人&#xff0c;最后多出1人;排成每行3人&#xff0c;也多出1人。分別排成每行4、5、6人&#xff0c;都多出1人。當排成每行7人時&#xff0c;正好不多,求校體操隊至少多少人。 輸入描述 無 輸出描述 滿足要求的人數 樣例輸入…

Python語法學習之 - 生成器表達式(Generator Expression)

第一次見這樣的語法 本人之前一直是Java工程師&#xff0c;最近接觸了一個Python項目&#xff0c;第一次看到如下的代碼&#xff1a; i sum(letter in target_arr for letter in source_arr)這條語句是計算source 與 target 數組中有幾個單詞是相同的。 當我第一眼看到這樣…

shell遍歷路徑所有文件并把列表寫成字符串遍歷

1. ls dir/* | tr ‘\n’ ’ ’ 換行替換成空格 你可以使用 ls 命令和 tr 命令來將文件列表根據空格拼接起來成一個字符串。以下是一個示例&#xff1a; ls dir/* | tr \n 解釋 ls dir/*&#xff1a;列出 dir 目錄下的所有文件。tr \n &#xff1a;將所有的換行符&#xf…

ChatGPT生成常見面試題【面試準備】

ChatGPT生成常見面試題【面試準備】 前言版權ChatGPT生成常見面試題【面試準備】MySQL面試問題與回答1. 數據庫連接與操作2. 索引和查詢優化3. 事務管理4. 索引是什么&#xff1f;為什么使用索引可以提高查詢性能&#xff1f;如何在MySQL中創建索引&#xff1f;5. SQL查詢優化有…

Varjo XR-4功能詳解:由凝視驅動的XR自動對焦相機系統

Varjo是XR市場中擁有領先技術的虛擬現實設備供應商&#xff0c;其將可變焦距攝像機直通系統帶入到虛擬和混合現實場景中。在本篇文章中&#xff0c;Varjo的技術工程師維爾蒂莫寧詳細介紹了這項在Varjo XR-4焦點版中投入應用的技術。 對可變焦距光學系統的需求 目前所有其他XR頭…

WPF之容器標簽之Canvas布局標簽

Canvas: 定義一個區域&#xff0c;可在其中使用相對于 Canvas 區域的坐標以顯式方式來定位子元素。 實例 可以在子標簽使用Canvas屬性設置定位 <Canvas Width"500" Height"300"><StackPanel Width"100" Height"100"Backgro…

網頁抓取之requests庫的使用

Python網絡數據采集利器 - Requests庫的使用指南 簡介 在Python網絡爬蟲領域,優秀的第三方庫Requests可謂是必學的重要工具。它提供了相當人性化的API,讓我們能夠用極其簡潔的代碼發送HTTP/HTTPS請求,并且自動處理cookies、headers、編碼等諸多繁瑣細節,大大減輕了網頁抓取的…

【pdb的使用方法】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、 pdb 是什么&#xff1f;二、基本用法1.啟動 PDB 調試器&#xff1a;2.單步執行代碼&#xff1a;3.查看變量值&#xff1a;4.退出調試器&#xff1a; 三、高級用…

指數分布的理解,推導與應用

指數分布的定義 在浙大版的教材中&#xff0c;指數分布的定義如下&#xff1a; 若連續型的隨機變量 X X X的概率密度為&#xff1a; f ( x ) { 1 θ e ? x θ , x>0 0 , 其他 f(x) \begin{cases} \frac{1}{\theta} e^{-\frac{x}{\theta}}, & \text{x>0}\\ 0, &a…

mvn編譯所有單元測試報錯OOM

org.mockito.exceptions.base.MockitoException: Cannot instantiate InjectMocks field named ‘productLogic’ of type ‘class .ProductLogic’. You haven’t provided the instance at field declaration so I tried to construct the instance. However the constructo…

Python正則表達式與Excel文件名批量匹配技術文章

目錄 引言 正則表達式基礎 Python中的re模塊 Excel文件名批量匹配案例 常見問題與解決方案 結論 引言 在現代辦公環境中&#xff0c;Excel文件幾乎成為了數據分析和處理的標配工具。由于Excel文件可能包含大量的數據和信息&#xff0c;因此&#xff0c;對Excel文件的命名…

在aspNetCore中 使用System.Text.Json的定制功能, 將定制化的json返回給前端

C# 默認大寫, 而大部分的前端默認小寫, 這時候可以如此配置: builder.Services.AddControllers().AddJsonOptions((opt) > {opt.JsonSerializerOptions.PropertyNamingPolicy System.Text.Json.JsonNamingPolicy.CamelCase;opt.JsonSerializerOptions.WriteIndented true…

DSPF網絡類型實驗1

對R6配置 對R1配置 對R2 對R3 對R4 對R5 對R1R2R3R4R5加用戶 環回處理 然后開始配置缺省 R1有兩個下一跳 3&#xff0c;4&#xff0c;5同R2 然后對R1 dynamic動態 對R2 手寫 把注冊加上 register R3同R2處理

機柜里面的設備有哪些

一、服務器 服務器是機柜中最常見的設備之一。它們通常被用于存儲和運行數據、應用程序和服務。不同的服務器通常使用不同的操作系統和處理器架構&#xff0c;以滿足不同的需求。服務器可以使用冗余電源和冗余存儲空間等措施&#xff0c;以確保數據安全和可靠性。 二、交換機 交…

刪除鏈表的倒數第N個節點-力扣

第一種方法是使用前后指針&#xff0c;前指針先向前走n1步&#xff0c;然后前后指針同時向前&#xff0c;當前指針指向NULL時&#xff0c;后指針正好指向需要刪除的節點的前一個節點&#xff0c;操作后指針刪除即可。 代碼如下&#xff1a; /*** Definition for singly-linked…

醫學圖像分割

論文&#xff1a;Medical Image Segmentation Using Deep Learning: A Survey 參考&#xff1a;[醫學圖像分割綜述] Medical Image Segmentation Using Deep Learning: A Survey-CSDN博客 一、背景 特征表示的困難&#xff1a;模糊、噪聲、對比度低--->CNN屬于語義分割&a…

Web Server項目實戰2-Linux上的五種IO模型

上一節內容的補充&#xff1a;I/O多路復用是同步的&#xff0c;只有調用某些API才是異步的 Unix/Linux上的五種IO模型 a.阻塞 blocking 調用者調用了某個函數&#xff0c;等待這個函數返回&#xff0c;期間什么也不做&#xff0c;不停地去檢查這個函數有沒有返回&#xff0c…

Offline RL : Beyond Reward: Offline Preference-guided Policy Optimization

ICML 2023 paper code preference based offline RL&#xff0c;基于HIM&#xff0c;不依靠額外學習獎勵函數 Intro 本研究聚焦于離線偏好引導的強化學習&#xff08;Offline Preference-based Reinforcement Learning, PbRL&#xff09;&#xff0c;這是傳統強化學習&#x…