1. 程式人生 > >CTCI系列--1.4 字元替換(C語言)

CTCI系列--1.4 字元替換(C語言)

題目:Write a method to replace all spaces in a string with ‘%20’.You may assume that the string has sufficient space at the end of the string to hold the additional characters,and that you are given the “true” length of the string.(Note:if implementing in Java,please use a character array so that you can perform this operation in place.)
EXAMPLE
Input: “Mr John Smith ”
Output:”Mr%20John%Smith”
寫一個方法用’%20’替換字串中的所有空格。你需要確保字串有足夠的空間來儲存額外的字元,你被給與字串的真實長度。(注意:如果用Java實現,請使用character array這樣你可以執行這個操作。)

解題思路

首先按照題目意思是將空格替換為’%20’,但按照題目給的示例字串末尾的空格並沒有轉換成’%20’。我們這裡還是按照將==所有==空格都轉換成’%20’來處理。

在字串處理中有個通用的方法是從字串的末尾開始往回處理,我們這裡就使用這個方法。

步驟:
- 獲取字串有效長度以及字元陣列的總大小
- 計算字串中空格的數目
- 計算替換空格後字串的總長度並與字元陣列大小比較。若超出字元陣列大小則報錯
- 從字串末尾開始將字元搬移到新的位置,若遇空格則替換為’%20’

程式碼實現

演算法程式碼與測試程式如下:

#include <stdio.h>
#include <string.h>
int replaceSpace(char *str, int totalLen) { int newStrLen = 0; int originStrLen = 0; int spaceCount = 0; int i; originStrLen = strlen(str); for (i = 0; i < originStrLen; i++) { if (str[i] == ' ') { spaceCount++; } } newStrLen = originStrLen + spaceCount * 2
; if (newStrLen + 1 > totalLen) return -1; str[newStrLen] = '\0'; for (i = originStrLen - 1; i > 0; i--) { if (str[i] == ' ') { str[newStrLen - 1] = '0'; str[newStrLen - 2] = '2'; str[newStrLen - 3] = '%'; newStrLen = newStrLen - 3; } else { str[newStrLen - 1] = str[i]; newStrLen = newStrLen - 1; } } return 0; } #define BUFLENS 50 int main(void) { char buf[BUFLENS] = "Mr John Smith "; printf("%s\n", buf); replaceSpace(buf, BUFLENS); printf("%s\n", buf); getchar(); return 0; }

執行結果

執行結果

相關推薦

CTCI系列--1.4 字元替換C語言

題目:Write a method to replace all spaces in a string with ‘%20’.You may assume that the string has sufficient space at the end of

CTCI系列--1.5 字串壓縮C語言

題目:Implement a method to perform basic string compression using the counts of repeated characters. For example,the string aabccc

編寫程式數一下 1到 100 的所有整數中出現多少次數字9C語言

#include <stdio.h> int main() { int i = 0; int count = 0; for (i = 1; i <= 100; i++) { if (i % 10 == 9) { count++; } if (i

PAT乙級1001害死人不償命的(3n+1)猜想C語言

  卡拉茲(Callatz)猜想: 對任何一個正整數 n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把 (3n+1) 砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到 n=1。卡拉茲在 1950 年的世界數學家大會上公佈了這個猜想,

CCF 201703-1 分蛋糕C語言

【問題描述】 小明今天生日,他有n塊蛋糕要分給朋友們吃,這n塊蛋糕(編號為1到n)的重量分別為a1, a2, …, an。小明想分給每個朋友至少重量為k的蛋糕。小明的朋友們已經排好隊準備領蛋糕,對於每個朋友,小明總是先將自己手中編號最小的蛋糕分給他,當這個朋友所分得蛋糕的重量不到k時

資料結構實現 8.1:字典樹C++版

資料結構實現 8.1:字典樹(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 查詢操作 2.3 其他操作 3. 演算法複雜度分析 3.1 增加操作 3.2 查

資料結構實現 10.1:AVL樹C++版

資料結構實現 10.1:AVL樹(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.1.1 左左 2.1.2 右右 2.1.3 左右 2.1.4 右左 2.1

演算法7-4,7-5:圖的遍歷——深度優先搜尋c語言

[提交] [統計] [提問] 題目描述 深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都

演算法4-7:KMP演算法中的模式串移動陣列c語言

題目描述 字串的子串定位稱為模式匹配,模式匹配可以有多種方法。簡單的演算法可以使用兩重巢狀迴圈,時間複雜度為母串與子串長度的乘積。而KMP演算法相對來說在時間複雜度上要好得多,為母串與子串長度的和。但其算符比較難以理解。 在KMP演算法中,使用到了一個next陣列。這個陣列就是在比較

演算法4-6:KMP字串模式匹配演算法實現 c語言

[提交] [統計] [提問] 題目描述 KMP演算法是字串模式匹配演算法中較為高效的演算法之一,其在某次子串匹配母串失敗時並未回溯母串的指標而是將子串的指標移動到相應的位置。嚴蔚敏老師的書中詳細描述了KMP演算法,同時前面的例子中也描述了子串移動位置的陣列實現的演算法。前面你已經實現

計算1~100之間,能被3整除但是不能被7整除的數的和C語言

#include<stdio.h> int main(agrc *agrv) { int n,i; int sum=0; scanf("%d",&n); for(i=1;i<=n;i++){ if(i%3==0&&i%7!=0){ sum+=i; &

PTA-刪除重複字元C語言

本題要求編寫程式,將給定字串去掉重複的字元後,按照字元ASCII碼順序從小到大排序後輸出。 輸入格式: 輸入是一個以回車結束的非空字串(少於80個字元)。 輸出格式: 輸出去重排序後的結果字串。 輸入樣例: ad2f3adjfeainzzzv 輸出樣例: 23adefijnvz

LeetCode 3.無重複字元的最長子串 Longest Substring Without Repeating CharactersC語言

題目描述: 給定一個字串,請你找出其中不含有重複字元的最長子串的長度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因為無重複字元的最長子串是 “abc”,所以其長度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋

LeetCode 1.兩數之和 Two Sum C語言

題目描述: 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的兩個整數。 你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。 示例 給定 nums = [2, 7, 11, 15], target = 9

Leetcode題解系列——64. Minimum Path Sumc++版

題目連結:64. Minimum Path Sum 題目大意:給出一個矩陣,現在想尋求一條從最左上元素到達最右下的最短路徑,且只能向下走或者向右走兩種途徑。 一.演算法設計 這也是一道典型的動態規劃題目,我設計狀態為sum[ i ][ j ] 表示為第i行第j列到達該點的最短

Leetcode題解系列——Count Complete Tree Nodesc++版

題目大意:統計一棵完全二叉樹的結點數 注意點: 完全二叉樹的性質:葉子結點只可能在該二叉樹最大的兩層上出現,而且結點先放滿左子樹再放右子樹。 使用直接掃描結點方法來統計,時間複雜度過高,顯然不

Leetcode演算法題C語言1

題目描述:給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], ta

Leetcode題解系列——Max Area of Islandc++版

題目大意:給出一個n*m的01矩陣,在矩陣中找出連續1所佔據的最大面積。連續指的是一個單位的上下左右必須有一個為1. 注意點: 矩陣不一定是方陣,在判斷長度時候要注意長和寬。 要注意搜尋時候出現越界的情況,要判斷座標是否合理。 利用深度搜索時候,可以不用vi

Leetcode題解系列——264. Ugly Number IIc++版

題目連結:264. Ugly Number II 題目大意:輸出第n個順序的醜數,醜數的定義為一個數的質因子只能是2,3,5. 例子: 6是醜數,6 = 2 * 3 8是醜數,8 = 2 * 2 * 2 14不是醜數, 14 = 7 * 2. 包含了7

Leetcode題解系列——45. Jump Game IIc++版

題目大意:與之前的跳躍遊戲一樣,從下標0出發,檢視是否能跳躍到陣列的最後一個下標。陣列的每個元素都是能跳躍的距離,現在要求輸出跳躍到最後下標的最小步數。 注意點: 這次要求所給的陣列都能到達最後下標,即無需考慮到達不了的情況 不一定每次都走最大的距離,才能最