05 替換空格

題目描述:

請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。

解題思路有:

?#判斷字符串是否為空,判斷length是否大于0。

?#記錄空格的數量,沒有空格直接返回原字符串。

1)考慮的問題:替換字符串是在原字符串上修改(A)還是新建字符串修改(B)

2)在當前字符串替換,怎么替換才更有效率

2-1 從前往后替換,后面的字符要不斷往后移動,要多次移動,所以效率低下(在原字符串改動時)

2-2 從后往前,先計算需要多少空間,然后從后往前移動,則每個字符只為移動一次,這樣效率更高一點。

?

測試用例:

?1)輸入中包含空格(空格位于最前方,最后方,中間,有連續多個空格)

"hello world"

?2)輸入中沒有空格

?3)特殊輸入測試(字符串是nullptr指針;字符串是空字符串

?

代碼:


?A 新建字符串+從前往后復制? 運行時間:3ms 占用內存:400-600k

 1 class Solution {
 2 public:
 3     void replaceSpace(char *str,int length) {
 4         //判斷特殊的情況
 5         if(str==NULL||length<=0)
 6             return;
 7         int totalLength=0;
 8         vector<int> index ;
 9 
10         for (int i=0;str[i]!='\0';i++){
11             totalLength++;
12             //if(isspace(str[i]))
13             if(str[i]==' ')
14                 index.push_back(i);
15         }
16         
17         if (index.empty()) //判斷是否有空格
18             return;
19         else{
20             int spaceNum = index.size();
21             char* newstr = new char [totalLength+spaceNum*2+1]; //用不用加1?
22 
23             for(int i=0,k=0;i<=totalLength;i++) // 判斷的時候有等于(<=)'\0'也要拷貝
24             {
25                 if(i==index[k]){
26                     *newstr++='%';
27                     *newstr++='2';
28                     *newstr++='0';
29                     str++;
30                     k++;
31                 }
32                 else
33                     *newstr++=*str++;
34             }
35             newstr=newstr-(totalLength+spaceNum*2)-1;
36             str=str-totalLength-1;
37             for(int j=0;j<=(totalLength+spaceNum*2);j++){
38                 str[j]=newstr[j];
39             }
40         }
41     }
42 };
new array + front to back

注意:

1」主體代碼line23-34執行結束后,newstr指針內存儲修改后的代碼。但該段代碼執行后指針指向'\0'的后一位(因此要多減一個1),要根據字符串長度將指針移回原始位置。(不要忘記指針移動)

2」要修改的是str,因此將newstr的值拷貝給str,函數運行結束后,newstr的被釋放(局部作用域)。

3」if (str==NULL||length<=0),使用||而不是&&。


B 原始字符串+從后往前復制(使用數組) 運行時間:5ms 占用內存:476k

 1 class Solution {
 2 public:
 3     void replaceSpace(char *str,int length) {
 4         if (str==NULL||length<=0)  //應該使用||而不是&&,因為兩個中任意一個成立,均不用在判斷
 5             return;
 6         int totalLen = 0,spaceNum=0;
 7         for(int i=0;str[i]!='\0';i++){
 8             totalLen++;
 9             if(str[i]==' ')
10                 spaceNum++;
11         }
12         int totalNew = totalLen +2*spaceNum;
13         //注意:c++中u取反使用!,而不是~(~1=-2,結果是true)
14         if(!spaceNum||totalNew>length) //totalNew>length(應該是大于符號)
15             return;
16         for(int k = totalLen,j=totalNew;k>=0;k--,j--){
17             if(k==j)
18                 return;
19             if(str[k]==' '){
20                 str[j]='0';
21                 str[--j]='2';
22                 str[--j]='%';
23             }
24             else{
25                 str[j]=str[k];
26             }
27         }
28     }
29 };
ori array + back to front

注意:

1」C++中,取反使用!(即int spaceNum =1; !spaceNum; 結果是0)

而~spaceNum 結果是-2(true)

2」~20=-21,規律如下:

20的原碼:0001 0100

~操作:1110 1011(逐位取反)這是一個負數,負數在計算機中以補碼形式存儲。因此該序列是一個負數的補碼

該負數的補碼:1110 1011

該負數的反碼:1110 1010 (減1)

該負數的原碼:1001 0101(首位是符號位,-1)(0010101為21)。最后結果為-21


?C 原始字符串+從后往前復制(使用指針

 1 class Solution {
 2 public:
 3     void replaceSpace(char *str,int length) {
 4          if(str==NULL||length<=0)
 5              return ;
 6          int CountOfBlanks=0;
 7          int Originallength=0;
 8          for(int i=0;str[i]!='\0';i++)
 9              {
10              Originallength++;
11              if(str[i]==' ')
12                  ++CountOfBlanks;
13          }
14          int len =Originallength+2*CountOfBlanks;
15          if(len+1>length||!CountOfBlanks) //即:len>=length
16              return ;
17           
18          char*pStr1=str+Originallength;//復制結束符‘\0’
19          char*pStr2=str+len;
20         while(pStr1<pStr2)
21             {
22             if(*pStr1==' ')
23                 {
24                 *pStr2--='0';
25                 *pStr2--='2';
26                 *pStr2--='%';    
27             }
28             else
29              {
30                  *pStr2--=*pStr1;
31             }
32             --pStr1;
33         }
34     }
35 };
use point

1」當兩個指針相等的時候,終止。(此時已經沒有空格了)


?

編寫代碼時遇到的問題:

?1)判斷字符串(char *str)是否為空:if(str==NULL)

?2)判斷某個字符是否是空格(兩種方法):isspace(str[i]) 或 if(str[i]==' ')

?

基礎知識:

1)字符串的最后一個字符是'\0',用于判斷一個字符串是否結束。

2)編寫程序時,一定要考慮極端的情況,如要查找的數組是空的,字符串是空的,要賦值的對象是同一個對象等。

3)原碼:一個正數,轉換為二進制位就是這個正數的原碼。負數的絕對值轉換成二進制位然后在高位補1就是這個負數的原碼

???? 反碼:正數的反碼就是原碼,負數的反碼等于原碼除符號位以外所有的位取反

???? 補碼:正數的補碼與原碼相同,負數的補碼為 其原碼除符號位外所有位取反(得到反碼了),然后最低位加1

???? 即:正數的反碼和補碼都與原碼相同。

??????????? 在計算機中,正數是直接用原碼表示的,負數用補碼表示!

?

仍存在的問題:

1)length是指什么?

?猜測:限定原始字符串指針str可擴展的內存空間,即記錄總長度。

?

# prac 02

class Solution {
public:void replaceSpace(char *str,int length) {cout <<str<<endl;int num_sapce = 0;for(int i = 0;i<length;i++)if (str[i]==' ')num_sapce+=1;//if (num_sapce<1)//return str;int new_length = length + 2*num_sapce;char* new_str = new char[new_length];for(int old_index = length-1,new_index =new_length -1; old_index>=0;)if (str[old_index]==' '){old_index-=1;new_str[new_index--]='0';new_str[new_index--]='2';new_str[new_index--]='%';}else {new_str[new_index]=str[old_index];old_index-=1;new_index-=1;}for (int k = 0;k<new_length;k++){str[k]=new_str[k];}}
};
//題目要求:在原來的字符串上修改(即字符串首地址不變)
//因此,要把字符串在一次賦值回去,可以選擇不生成新的變量,在原地址上修改。

  

轉載于:https://www.cnblogs.com/GuoXinxin/p/9955330.html

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

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

相關文章

超鏈接禁用_在Microsoft Word 2003和2007中禁用自動超鏈接

超鏈接禁用If you can’t stand the automatic hyperlinking in Microsoft Word, you might be hard-pressed to find the right place to disable it in Office 2007, since all the settings are hidden so well compared to previous versions. 如果您無法在Microsoft Word中…

c語言如何創建虛擬串口,模擬串口的C語言源程序代碼

本程序是模擬串口硬件機制寫的&#xff0c;使用時可設一定時中斷&#xff0c;時間間隔為1/4波特率&#xff0c;每中斷一次調用一次接收函數&#xff0c; 每中斷4次調用一次發送函數,不過.對單片機來說時鐘并須要快.要知道9600的波特率的每個BIT的時間間隔是104us.而單片機中斷一…

webjars管理靜態資源

webjars用途簡單解釋 : 利用Servlet3協議規范中,包含在JAR文件/META-INF/resources/路徑下的資源可以直接被web訪問到這一原理&#xff0c;將前端靜態資源打成jar包方便管理 靜態資源打jar包 新建maven工程&#xff0c; 將需要打包的靜態資源放入src/main/resources中 2. ma…

Windows Intellij環境下Gradle的 “Could not determine Java version from ‘9.0.1’”的解決方式...

當我導入Gradle項目初試Java spring的時候&#xff0c;遇到下面報錯: Gradle complete project refresh failed Error:Could not determine java version from 9.0.1. 參考這篇 http://www.ddiinnxx.com/solving-not-determine-java-version-9-0-1-gradle-intellij-macosx/ 進行…

如何計算iPhone和Apple Watch上的步數

Khamosh PathakKhamosh PathakAccording to conventional wisdom, 10,000 steps a day equals a healthy life. No matter what your target is, though, you’ll need a reliable way to count your steps. The good news is you can do so on your iPhone or Apple Watch! 根…

在c語言中load,一道題理清Objective-C中的load和initialize

Objective-C中有兩個方法比較特殊&#xff0c;他們會在Runtime時根據情況自動調用&#xff0c;下面我們簡單分析一下調用時機以及使用場景~一般在iOS初中級面試時偶爾會被問到load和initialize方法&#xff0c;我出了一道題&#xff0c;估計會搞暈很多人。大家來看一下下面的程…

018.Zabbix維護時間和模板導入

一 維護時間 在某些正常業務維護期間&#xff0c;不需要進行告警&#xff0c;可添加維護時間。二 維護時間添加 2.1 維護 參數描述Name維護名稱Maintenance type兩種維護類型可選:With data collection - 依舊收集數據No data collection - 暫停收集數據Active since維護周期開…

本地服務器下的局域網安全嗎_本地安全認證服務器

本地服務器下的局域網安全嗎Today a reader had a very good question about lsass.exe is the Microsoft security management process for domain access and local security policies. Simply put it manages who logs on to your PC and/or Server. There are a few viru…

Query-digest-UI監控慢查詢,以及此工具的改進版

本文主要描述基于pt-query-digest工具對慢查詢日志進行監控的工具Query-digest-UI。(安裝、使用、介紹以及benren提供的改進版。) 本文中描述的內容與其他網站上對Query-digest-UI的安裝和使用稍有不同&#xff0c;因為本人對此工具稍做了調整。歡迎轉載&#xff0c;請注明作者…

電熱水器工作過程 c語言,熱水器工作流程圖

燃氣熱水器做為熱水供應設備&#xff0c;被很多家庭所采用&#xff0c;然而&#xff0c;恒溫作為燃氣熱水器的一個痛點&#xff0c;一次次被擊中&#xff0c;那么到底為什么燃氣熱水器實現恒溫這么難呢&#xff1f;我們將從原理講起&#xff0c;帶您認識真正的燃氣熱水器。燃氣…

es6 模塊化

test.js var vm"321321"; export { vm }; ------------------------------------------------------ export var name"李四"; a.vue import {vm} from /test console.log(vm); ------------------------------------------------------ console.log(name);…

linux上tail命令_如何在Linux上使用tail命令

linux上tail命令Fatmawati Achmad Zaenuri/ShutterstockFatmawati Achmad Zaenuri / ShutterstockThe Linux tail command displays data from the end of a file. It can even display updates that are added to a file in real-time. We show you how to use it. Linux tail…

初學者萬年歷c語言源代碼,C語言萬年歷的源程序

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓for(j1;j<mon[i];j){cprintf("%3d ",j);/*if((firstj-1)%70)putchar(\n);*/}/*first(firstmon[i])%7;if(first0)first7;*/}}void month5_8(){for(i0;i<2;i){window(2i*w,3,29w*i,11);textbackground(5);clrscr();t…

用imageMagick的composite合并圖片

composite命令可以非常方便的合并兩張圖片 因此用來進行圖像加水印、批量增加邊框等常用的變換 最簡單的用法為&#xff1a; composite -gravity north src.jpg coverback.jpg des.jpg 其中src.jpg為前景圖片 coverback.jpg為背景圖片。 des.jpg為疊加后的結果 -gravity north …

白帽子講web安全——認證與會話管理

在看白帽子講web安全&#xff0c;剛好看到認證與會話管理&#xff1a;也就是我們在平常滲透測試中遇到最多的登錄頁面&#xff0c;也即是用戶名和密碼認證方式&#xff0c;這是最常見的認證方式。 了解兩個概念&#xff1a;認證和授權 1&#xff09;&#xff1a;認證的目的是為…

iphone充電圖_哪些iPhone具有無線充電功能?

iphone充電圖Kevin Parrish凱文帕里什Wireless charging means you can re-energize your phone’s battery without a physical tether. It also prevents possible damage to your phone’s charging port. Unfortunately, not all phones support wireless charging, but we…

關聯分析算法c語言實現,機器學習關聯分析

AI開發平臺ModelArtsModelArts是面向開發者的一站式AI開發平臺&#xff0c;為機器學習與深度學習提供海量數據預處理及半自動化標注、大規模分布式Training、自動化模型生成&#xff0c;及端-邊-云模型按需部署能力&#xff0c;幫助用戶快速創建和部署模型&#xff0c;管理全周…

windows平臺下基于QT和OpenCV搭建圖像處理平臺

在之前的博客中&#xff0c;已經分別比較詳細地闡述了“windows平臺下基于VS和OpenCV”以及“Linux平臺下基于QT和OpenCV"搭建圖像處理框架&#xff0c;并且生成了相應的免費視頻。這篇博客的主要內容&#xff0c;就是基于最新版本的相應工具&#xff0c;在windows平臺下&…

android死鎖解決方案,【線程死鎖】Android多線程死鎖產生的原因以及如何避免

一、死鎖定義1、生活中的列子兩人吃飯&#xff0c;但只有一雙筷子&#xff0c;2人輪流吃(同時擁有2只筷子才能吃)&#xff0c;某個時候一人拿了左筷子&#xff0c;一人拿了右筷子&#xff0c;兩人同時占用一個資源&#xff0c;等待另一個資源&#xff0c;這時候甲等乙吃完并釋放…

前端開發 常用用的靜態服務器

1 運用anywhere 安裝 &#xff1a;npm install anywhere -g想要以某個路徑作為靜態文件服務器的根目錄分享&#xff0c;只需要在該目錄下執行&#xff1a;anywhere 就會默認8000打開網頁&#xff0c; 若文件不是index.html 需要輸入文件名 A: anywhere -p 8000 ## 指定靜態服務…