面試經典150題——簡化路徑

"A goal is a dream with a deadline." - Napoleon Hill

red white yellow and blue plastic dice

1. 題目描述

image-20240303085628594

2. ?題目分析與解析

2.1 思路一

這個題目開始看起來并不太容易知道該怎么寫代碼,所以不知道什么思路那就先模擬人的行為,比如對于如下測試用例:

首先 /代表根目錄,然后向后走,發現 a/,滿足規則,繼續向后走,發現 ./,其實就是表示當前路徑,那說明可以省略,就刪除該部分。

繼續向后,發現 b/,滿足規則,繼續向后走,發現 ../,表示當前路徑的上一級目錄。根據前面走過的步驟,可以知道當前路徑為:/a/b,一次回到上一級目錄就是 /a

繼續向后走,發現還有一個 ../,又需要回到上一級目錄,也就是 /

最后發現 c/,說明最終的結果是 /c

而對于如下測試用例:

image-20240303091651821

我們可以發現對于雙 /需要特殊處理。

根據以上描述,我們可以粗略的描述一下代碼思路:

  1. 定義結果字符串,用一個字符數組最好(方便后續按照塊刪除)

  2. 遍歷path

  3. 截取下一個 /之前的字符

    • 如果發現截取出的是 .,就刪除這一小段

    • 如果發現截取出的是 ..,就刪除上一個小塊的文件地址,比如對于當前路徑為 /asad/qwej,如果發現此時截取了 ..,就刪除塊 /qwej

    • 如果發現是空(對應 // 的情況),就跳過

    • 如果發現是其它字符串,那就在當前塊前面加一個 / 然后直接拼接上。(比如當前為/asad/qwej,此時發現對應字符串為 poi,那么就將 "/" + "poi",拼接在/asad/qwej后面形成/asad/qwej/poi

3.2 思路二

既然我們要處理的特殊情況就那么幾種:

  1. 出現 .

  2. 出現 ..

  3. 多余的

  4. 正常出現文件路徑

那么我們是不是可以

  1. 將1視為什么都不做?

  2. 將2視為減少一個路徑

  3. 將3跳過

  4. 將4視為增加一個路徑

又因為我們要增加或者減少的哪個路徑總是在我們剛剛遍歷過的地方,也就是之前的路徑我不需要管,相當于先進,后來的內容我要進行判斷,相當于后出,那么是不是就可以使用棧來解決?(其實思路和思路一沒什么區別,就是把數組換成棧了)

所以根據以上內容我們可以寫出如下代碼思路:

  1. 定義一個棧

  2. 遍歷path

  3. 發現出現 .,對棧保持不動

  4. 發現出現 ..,就彈棧,直到彈出一個 /

  5. 如果發現是空(對應 // 的情況),就跳過

  6. 如果發現是其它字符串,那就在當前塊前面加一個 / 然后入棧

3. 代碼實現

3.1 思路一

image-20240303095225873

image-20240303095201505

3.2 思路二

image-20240303100824154

image-20240303100755316

4. 相關復雜度分析

思路一:

  • 時間復雜度:O(n),其中 n 是路徑字符串的長度。在遍歷路徑字符串的過程中,執行了一些常數時間的操作,例如字符串拼接、字符串比較等。

  • 空間復雜度:O(n),使用了一個 ArrayList 和一個 StringBuilder。ArrayList 的空間取決于路徑中塊的數量,而 StringBuilder 的空間取決于路徑中每個塊的長度。

思路二:

  • 時間復雜度:O(n),其中 n 是路徑字符串的長度。首先,通過 split() 方法將路徑字符串分割成一個字符串數組,時間復雜度為 O(n)。然后,對字符串數組進行遍歷,執行了一些常數時間的操作,例如棧的入棧和出棧操作。

  • 空間復雜度:O(n),使用了一個棧和一個字符串數組。棧的空間取決于路徑中塊的數量,而字符串數組的空間取決于路徑中塊的數量以及每個塊的平均長度。

綜上所述,思路一和思路二的時間復雜度都是線性的,但在空間復雜度上稍有不同。思路一的空間復雜度主要取決于路徑中每個塊的長度,而思路二的空間復雜度主要取決于路徑中塊的數量。通常情況下,思路二的空間復雜度略低于思路一。

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

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

相關文章

手把手教會你使用Markdown【從入門到精通一篇就夠了】

手把手教會你使用Markdown【從入門到精通一篇就夠了】 前言一、Markdown是什么二、Markdown優點三、Markdown的基本語法3.1 標題3.2 字體3.3 換行3.4 引用3.5 鏈接3.6 圖片3.7 列表3.8 分割線3.9 刪除線3.10 下劃線3.11 代碼塊3.12 表格3.13 腳注3.14 特殊符號 四、Markdown的高…

UCSF DOCK 分子對接詳細案例(04)-基于RDKit描述符的分子從頭設計DOCK_D3N

歡迎瀏覽我的CSND博客! Blockbuater_drug …點擊進入 文章目錄 前言一、 軟件及操作環境二、研究目的三、結構文件準備四、 DOCK/RDKit中 de novo design4.1 de novo design - refine_D3N4.2 對輸出重新評分 總結參考資料 前言 本文是UCSF DOCK的使用案例分享&…

lv20 QT事件5

1 事件模型 2 事件處理 virtual void keyPressEvent(QKeyEvent *event) virtual void keyReleaseEvent(QKeyEvent *event) virtual void mouseDoubleClickEvent(QMouseEvent *event) virtual void mouseMoveEvent(QMouseEvent *event) virtual void mousePressEvent(QMou…

【短時交通流量預測】基于Elman神經網絡

課題名稱:基于Elman神經網絡的短時交通流量預測 版本時間:2023-04-27 代碼獲取方式:QQ:491052175 或者 私聊博主獲取 模型簡介: 城市交通路網中交通路段上某時刻的交通流量與本路段前幾個時段的交通流量有關&#…

自己拍攝的視頻能做成二維碼嗎?快速在線生碼該怎么操作?

自己拍攝的視頻能做成二維碼嗎?現在掃描二維碼用來播放視頻的使用場景越來越多,這種方式的流行在于能夠通過更低的成本獲取更好的效果,有效的提升用戶獲取視頻內容的體驗,通過消耗流量就可以播放視頻。 那么視頻制作二維碼一般會…

vue2 vue-router源碼解析

目錄 Vue Router 的基本結構和功能 源碼分析 一. 編寫install 方法 二 .生命變量存儲路由信息和當前路由 三 .初始化路由 把路由信息記錄在routeMap中 四.注冊router-link 和router-view 組件 Vue Router 的基本結構和功能 路由器實例(Router 實例)…

Vue.js 修飾符:精準控制組件行為

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 🍚 藍橋云課簽約作者、上架課程《Vue.js 和 E…

多點通信與域套接字:2024/3/4

作業1&#xff1a;廣播 發送端&#xff1a; #include <myhead.h> int main(int argc, const char *argv[]) {//1.創建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}printf("sfd%d\n",sfd);//2.設置當前…

藍橋杯復習之前綴和

題目鏈接&#xff1a;https://www.luogu.com.cn/problem/P8649 思路&#xff1a; 看到區間和&#xff0c;第一反應肯定是前綴和&#xff0c;我們求出前綴和后對前綴和數組每一個值模k&#xff0c;然后對一個數組的值查看前面有幾個相同的&#xff0c;舉個例子&#xff1a;…

【python 常見錯誤】

標題【python 常見錯誤】 一、python 常見錯誤 Python編程過程中&#xff0c;開發者可能會遇到多種類型的錯誤。這些錯誤大致可以分為三類&#xff1a;語法錯誤&#xff08;SyntaxError&#xff09;、邏輯錯誤和運行時錯誤。下面將詳細介紹這幾種錯誤類型&#xff0c;并提供相…

【動態規劃】第十一屆藍橋杯省賽第二場C++ C組《數字三角形》(c++)

1.題目描述 上圖給出了一個數字三角形。 從三角形的頂部到底部有很多條不同的路徑。 對于每條路徑&#xff0c;把路徑上面的數加起來可以得到一個和&#xff0c;你的任務就是找到最大的和。 路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右邊的那個數。 …

Pytorch學習 day03(Tensorboard)

Tensorboard Tensorboard能夠可視化loss的變化過程&#xff0c;便于我們查看模型的訓練狀態&#xff0c;也能查看模型當前的輸入和輸出結果 在Pycharm中&#xff0c;可以通過按住ctrl&#xff0c;并左鍵點擊某個庫來進入源文件查看該庫的使用方法 SummaryWriter是用來向log_di…

3分鐘,學會一個測試員必懂 Lambda 小知識!

今天再來給大家介紹下函數式接口和方法引用。 函數式接口 問&#xff1a;Lambda 表達式的類型是什么&#xff1f; 答&#xff1a;函數式接口 問&#xff1a;函數式接口是什么&#xff1f; 答&#xff1a;只包含一個抽象方法的接口&#xff0c;稱為函數式接口 &#xff08;…

Linux服務器磁盤及內存用量監控Python腳本(推送釘釘群通知)

文章目錄 Python 腳本釘釘推送通知定時任務 Python 腳本 # -*- coding: utf-8 -*- import subprocessdef get_disk_usage():# 執行 df 命令獲取磁盤使用情況df_process subprocess.Popen([df, -h, /], stdoutsubprocess.PIPE)output, _ df_process.communicate()output out…

Lua 篇(一)— 安裝運行Hello World

目錄 前言一、Lua 是什么&#xff1f;二、Lua和C#的區別三、安裝 LuaLinux 系統上安裝Mac OS X 系統上安裝Window 系統上安裝emmyluaRider 安裝(推薦) 四、Lua學習資料 前言 Lua 是一種輕量級的嵌入式腳本語言&#xff0c;它可以與 C 語言無縫集成&#xff0c;提供了強大的編程…

YOLOv6-Openvino和ONNXRuntime推理【CPU】

1 環境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安裝Openvino和ONNXRuntime 2.1 Openvino簡介 Openvino是由Intel開發的專門用于優化和部署人工智能推理的半開源的工具包&#xff0c;主要用于對深度推理做優化。 Openvino內部集成了Opencv、Tens…

庫函數和頭文件

難道要求平方根也要自己寫一個&#xff1f; #include<iostream> #include<cmath>//頭文件<cmath>中包含許多數學庫函數 using namespace std; int main() {double a;cin>>a;if(a<0) {cout<<"Illegal input"<<endl;return 0;…

PHP語言常見面試題:在PHP中,如何聲明變量?變量的作用域是什么?

在PHP中&#xff0c;聲明變量非常直接和簡單。您只需要在變量名前加上$符號&#xff0c;然后為其分配一個值。這里有一個基本的例子&#xff1a; php復制代碼 <?php $variableName "Hello, World!"; // 聲明一個名為 $variableName 的變量&#xff0c;并賦值為…

DataGrip 2023:讓數據庫開發變得更簡單、更高效 mac/win

JetBrains DataGrip 2023是一款功能強大的數據庫IDE&#xff0c;專為數據庫開發和管理而設計。通過DataGrip&#xff0c;您可以連接到各種關系型數據庫管理系統(RDBMS)&#xff0c;并使用其提供的一組工具來查詢、管理、編輯和開發數據庫。 DataGrip 2023軟件獲取 DataGrip 2…

前端學習第七天-css常用樣式設置

達標要求 掌握元素的顯示與隱藏 熟練應用溢出的文字隱藏 熟練掌握版心和布局流程 1. 元素的顯示與隱藏 在CSS中有三個顯示和隱藏的單詞比較常見&#xff0c;我們要區分開&#xff0c;他們分別是 display visibility 和 overflow。 他們的主要目的是讓一個元素在頁面中消失…