[劍指Offer]替換空格

今天看題的時候,遇到一個替換空格的題目,分析一下哈。

題目要求:把字符串中的每個空格替換成“%20”。例如輸入“we are happy”,則輸出“we%20are%20happy”。

解題思路:我們首先想到的是:移位思想。遇到空格就將空格后的所有字符后移兩位,然后填充空格為%20。

實現代碼

#pragma once
#include<assert.h>
#include<string.h>char* StrReplace(char* str,size_t length)
{assert(str && length > 0);char *p = str;char *p1 = str;size_t len = strlen(str)+1;size_t i = len;while(p){while(*p != ' '){p++;if(*p == '\0'){return str;}}while((p1+i) != p){*(p1+i+1) = *(p1+i-1);i--;}len+=2;i = len;*p = '%';*(p+1) = '2';*(p+2) = '0';p+=2;}return str;
}void Test()
{char str[20] = "we are happy";cout<<StrReplace(str,20)<<endl;
}

但是,我們再看看它的時間復雜度哈。顯然,每次移位操作都是O(N),這樣經過多次移位,使它的時間復雜度就變為O(N^2)。這樣的效率實在有點低。我們如何提高它的時間復雜度呢?

思路2:我們可以用計數的方式,統計字符串中總共的空格數,然后從后向前移位,使用兩個指針,p1指向字符串開始的位置,p2指向字符串尾部,移位將p2移動2*空格個數位,遇到空格后填充,直到兩指針相遇,才停止移位。如圖所示(移位過程):

這里寫圖片描述

實現代碼

#pragma once
#include<assert.h>
#include<string.h>
char* StrReplace(char* str,size_t length)
{assert(str && length > 0);char *p = str;char *p1 = NULL;char *p2 = NULL;size_t len = strlen(str);int count = 0;//統計空格數while(*p != '\0'){if(*p == ' ')count++;p++;}count*=2;p1 = str+len;        //指向字符串尾p2 = str+len+count;  //指向修改后字符串正確的位置while(p1 != p2){if(*p1 == ' '){p2 -= 2;*p2 = '%';*(p2+1) = '2';*(p2+2) = '0';if(p1 != p)    //如果p1沒有到字符串頭時再減,防止越界{p1--;p2--;}}else              //不是空格則直接后移{*p2 = *p1;p1--;p2--;}}return str;
}void Test()
{char str[20] = "we are happy";cout<<StrReplace(str,20)<<endl;char str1[20] = " are happy";cout<<StrReplace(str1,20)<<endl;
}

執行結果

這里寫圖片描述

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

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

相關文章

C語言關鍵字 ISO/ANSI C90 C99 C11

面試考點 https://blog.csdn.net/csdn_kou/article/details/81113215 * 有的常用的我們都不知道是關鍵字&#xff0c;比如sizeof.這是面試中的考點&#xff0c;要注意。 * 同時當回答C語言中有多少關鍵字時&#xff0c;要回答前題條件&#xff0c;時針對哪一個版本

vm15 安裝 mac虛擬機的過程 轉載的

https://blog.csdn.net/weixin_43299649/article/details/82881567

task_struct解析

task_struct是Linux內核的一種數據結構&#xff0c;它用task_struct結構體來描述進程的信息。下面來剖析一下進程中保存的主要的信息有哪些&#xff1f; struct task_struct {//進程的運行時狀態volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */void …

ubuntu上有個小項目 ,需要調用xx.sh腳本, 出現無法識別 某些環境變量的解決辦法,僅供參考

項目是用python 調用 同事寫好的 xx.sh腳本&#xff0c; 在手動調用的時候 發現能正常調用&#xff0c; 當用python代碼的時候&#xff0c; 就不行了&#xff0c; 通過日志發現&#xff0c; python調用的時候 不識別 ADNROID_NDK這個環境變量&#xff0c; 在python中 我是通過&…

關于sudo

之前&#xff0c;我們使用sudo的時候&#xff0c;是因為其用戶本身具有root權限&#xff0c;所以可以sudo后執行相關操作&#xff0c;但是對于普通用戶來說&#xff0c;它是既不具有sudo權限&#xff0c;又不在sudo用戶組中&#xff0c;那么我們來研究一下如何將新創建的用戶添…

在使用 python 封裝的進程池 from concurrent.futures import ProcessPoolExecutor 遇到的問題

在ubuntu中&#xff0c;用的是python3.5 executeprebuildpath ExecutePrebuild()processpool ProcessPoolExecutor(1)processpool.submit(executeprebuildpath.run).add_done_callback(self.precallback)processpool.shutdown(waitFalse)self.runsign Trueself.runningprebu…

對pthread_create未定義的引用

pthread庫不是Linux系統默認的庫&#xff0c;連接時需要使用庫libpthread.a,在編譯中要加-lpthread [koulocalhost practive]$ gcc creat.c /tmp/ccPULtaF.o&#xff1a;在函數‘main’中&#xff1a; creat.c:(.text0x58)&#xff1a;對‘pthread_create’未定義的引用 coll…

Bash入門

Bash簡介&#xff1a; Bash&#xff08;GNU Bourne-Again Shell&#xff09;是一個為GNU計劃編寫的Unix shell&#xff0c;它是許多Linux平臺默認使用的shell。 shell是一個命令解釋器&#xff0c;是介于操作系統內核與用戶之間的一個絕緣層。準確地說&#xff0c;它也是能力…

ubuntu 設置分辨率 親測可用 轉載的

網上試了很多方法, 這家管用 https://blog.csdn.net/qq_35661436/article/details/72802040

線程之售票系統pthread_mutex,_lock,_unlock

先看一下這篇文章 https://blog.csdn.net/csdn_kou/article/details/81148268 四個人同時買票票&#xff0c;引出線程 #include "head.h" int ticket 100; void * route(void *arg) {char *id (char *)arg;while(1){if(ticket>0){usleep(1000);printf("…

Bash基本語法

1. 變量賦值 a375 hello$a 這里需要注意的是&#xff0c;等號兩邊不能有空格 還有一個例子是這樣的 例1&#xff1a; 結果為&#xff1a; 關于上述&#xff0c;主要有如下幾點&#xff1a; $hello和${hello}是一樣的&#xff0c;在bash中如果遇到空格&#xff0c;tab鍵時&a…

windows下 , py運用了 進程池, 將py打包成exe,出現錯誤的 解決思路之一

在windows上,用pycharm開發了一個小項目, 用到了from concurrent.futures import ProcessPoolExecutor 本來在pycharm里面,運行的好好地, 可是打包成exe的時候, 發現 當程序運行到 進程池執行任務的時候,會創建一個新的界面, 猜測應該是創建了一個新的進程, 百度后,發現在 程序…

關于fd和fp(fd:file descirptor fp:file pointor)

通常&#xff0c;我們在輸入數據或輸出數據的設備為鍵盤或者顯示器。當然&#xff0c;我們比較熟悉的輸入輸出&#xff0c;可能就是對于文件的操作&#xff0c;還有直接從終端輸出&#xff0c;顯示到顯示器上。在C語言中&#xff0c;我們使用fopen,fclose,fread,fwrite對文件進…

粗談pragma once與 #ifndef的區別

#ifnde不受編譯器的任何限制&#xff1b; #pragma once不受一些較老的編譯器支持&#xff0c;兼容性不夠好

在mac os10.13系統下 ,將py文件打包成可執行程序后, 里面的路徑出現的問題

本來 用命令行運行py文件, 代碼里面 獲取當前路徑的 語句 例如: os.getcwd() os.path.abspath(__file__) os.path.realpath(__file__)都可以獲取到當前文件的路徑, 但是打包成 可執行程序后, 統統不對了, 變成了 類似 /usr/xxx 的路徑 https://stackoverflow.com/questions/50…

[linux]wait詳解

wait&#xff1a;進程等待 主要有兩種等待方式&#xff1a;阻塞式等待和非阻塞式等待 阻塞式等待&#xff1a;如果子進程正在運行&#xff0c;父進程將會一直等待著子進程運行結束&#xff0c;并且自己什么事都不干 非阻塞式等待&#xff1a;如果子進程正在運行&#xff0c;…

centos 使vim支持+python和+python3

本文為了給ycm服務&#xff0c;不單獨存在。 查看是否支持python vim --version | grep python然后 下載vim8源碼&#xff1a; git clone https://github.com/vim/vim.git 1 進行編譯安裝,添加python3和python2.7的支持&#xff1a; 進入下載的vim的源碼文件夾中&#x…

ffmpeg的學習-00

命令行 大體樣式 ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...有道翻譯的 以后仔細回看 2.描述 ffmpeg是一個非常快的視頻和音頻轉換器&#xff0c;也可以從一個實時音頻/視頻源抓取。它還可以轉換之間的任意采樣…

[Linux]消息隊列

我們知道進程間通信的方法有多種&#xff0c;主要有管道&#xff0c;消息隊列&#xff0c;信號量&#xff0c;共享內存&#xff0c;socket等。之前介紹過管道&#xff0c;今天再介紹一個新的概念–消息隊列。 消息隊列&#xff1a;將一個進程到另一個進程之間發送數據塊的方式…