0928面試小節:刪除有序連結串列中的重複元素
0928美團面試真題。
幾天沒做題,真的手生…腦子確實很緊張,有點兒轉不動。最後當場掛麵了,面對現實,平靜接受吧。
事後遭遇YZT嘲諷,哈哈哈,倒也沒什麼,繼續加油就完事了…能走到哪一步就算哪一步吧!?
刪除有序連結串列中重複出現的節點
如輸入:1,2,3,3,4,4,5
則輸出:1,2,5
現在腦子清醒點了,面試中:
第一步應該是審題
,問清楚要求…然後丟擲一兩個可行的解(即使笨拙,但可靠),然後細化一些內容。
第二,先論證解法是否可行
,切勿急忙忙敲下程式碼。
第三,將想法付諸程式碼。如果在牛客上寫不出來,除錯不成功,通常不給本地除錯機會。還是得畫圖逐步來分析(切記:以後面試一定要帶上紙和筆,尤其是對於連結串列和dp相關的題,可以畫出來,不然抽象起來…緊張的時候可能會有紕漏。)
言歸正傳,此題顯然演算法簡單或者中級題。傻瓜式的可選的方案有:
-
雜湊。
遍歷連結串列…雜湊map統計每一個值出現的次數;將只出現一次的值,存入vector陣列。恢復連結串列(這一步實際上很折騰)。 -
常規解法:建議畫圖抽象出來
分析:
1)凡事先特判! 先特例,再抽象一般。
此題中:考慮,頭結點head為空或者head->next為空,則分別返回NULL和head即可。
2)一般:連結串列多於1個節點
由於連結串列頭結點可能存在重複,並且連結串列有序,則重複值必然連續…即curr->val !=curr->next->val
成立時,curr->val
不重複,否則尋找下一個不等於curr->val
的節點。
我們可以使用一個啞巴節點(此題不必須),來記錄不重複的節點。
用curr_num
記錄當前節點的值:
- 當
curr->val !=curr->next->val
滿足時,將該節點的值加入連結串列, - 否則尋找下一個值不等於curr_num的節點。
直到curr指標遍歷到連結串列末端節點,此時curr->next==NULL
。
則最後一個節點未新增進去,此時判斷其值是否等於curr_num即可,若不等,則加入。
以下為事後諸葛程式碼,歡迎批評斧正!
//
// Created by wbzhang on 2020/9/28.
//
#include <iostream>
#include <vector>
#include "../00-TopFrequency/helperList.h"
using namespace std;
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
if(!head) return NULL;
if(!head->next) return head; // 特判
// 啞巴節點
ListNode *dummyNode = new ListNode(-1);
ListNode *pre = dummyNode,*curr = head;
int curr_num = curr->val;
while(curr!=NULL && curr->next!=NULL)
{
curr_num = curr->val;
if(curr->next->val != curr_num){
ListNode* newNode = new ListNode(curr_num);
pre->next = newNode;
pre = pre->next;
// cout<<"once..."<<endl;
// printList(dummyNode->next);
// cout<<endl;
}
// 尋找下一個不同的值
while(curr->val == curr_num && curr->next!=NULL){
curr = curr->next;
}
}
// 最後一個節點無法覆蓋到
if(curr_num!=curr->val){
pre->next = curr;
}
// cout<<"once..."<<endl;
// printList(dummyNode->next);
// cout<<endl;
return dummyNode->next;
}
};
int main()
{
// 自選若干組測試用例如下:
// vector<int> nums = {1,2,3,3,4,4,5};
vector<int> nums = {1,2,2,3,3,4,4,5,5,5,5,5,5};
// vector<int> nums = {};
// vector<int> nums = {1};
// 構建連結串列
ListNode *head;
if(nums.size()>0){
head = new ListNode(nums[0] );
ListNode *curr = head;
for (int i = 1; i < nums.size(); ++i) {
ListNode *newNode = new ListNode( nums[i] );
curr->next = newNode;
curr = curr->next;
}
printList(head);
cout<<" ---" <<endl;
}else{
head = NULL;
}
Solution solu;
ListNode* ans = solu.deleteDuplicates(head);
cout<<"ans: "<<endl;
printList(ans);
}
相關文章
- (c語言實現)刪除有序連結串列中重複出現的元素C語言
- 演算法刪除單連結串列中重複的元素演算法
- JZ76 刪除連結串列中重複的節點
- 83. 刪除排序連結串列中的重複元素(JavaScript版)排序JavaScript
- 力扣-83. 刪除排序連結串列中的重複元素力扣排序
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- leetcode-82:刪除排序連結串列中重複的元素-iiLeetCode排序
- 從未排序的連結串列中刪除重複項排序
- 牛客網高頻演算法題系列-BM15-刪除有序連結串列中重複的元素-I演算法
- 刪除陣列中的元素(連結串列)陣列
- 讓我們一起啃演算法----刪除排序連結串列中的重複元素演算法排序
- LintCode 刪除排序連結串列中的重複數字 II排序
- 讓我們一起啃演算法----刪除排序連結串列中的重複元素 II演算法排序
- 刪除有序陣列中的重複項 II陣列
- 如何刪除ArrayList中的重複元素
- leetcode----刪除連結串列中的節點LeetCode
- c#刪除有序陣列中的重複項C#陣列
- js刪除陣列中重複的元素JS陣列
- js刪除陣列中的重複元素JS陣列
- ES6刪除字串中重複的元素字串
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 0026-刪除有序陣列中的重複項陣列
- 劍指offer:刪去連結串列中重複的節點。(題解原始碼加圖解)原始碼圖解
- 如何去除有序陣列中的重複元素陣列
- javascript刪除陣列中的重複元素程式碼JavaScript陣列
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- Remove Duplicates from Sorted List 去除連結串列中重複值節點REM
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題
- JavaScript 刪除陣列重複元素JavaScript陣列
- Remove Duplicate Letters 刪除重複元素REM
- JavaScript陣列刪除重複元素JavaScript陣列
- Java刪除ArrayList中的重複元素的2種方法Java
- js連線多個陣列並刪除重複的元素JS陣列
- leetcode面試經典150-26. 刪除有序陣列中的重複項LeetCode面試陣列
- 23. 合併K個元素的有序連結串列
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題