2空格替換&列表逆序輸出

第2篇 空格替換&列表逆序輸出

字符串——替換空格
鏈表——逆序輸出鏈表

替換空格

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

思路
如果用Python或者java等高級點的語言,直接調replace是最簡單的寫法了,或者開一個新字符串,從前往後讀原字符串,讀到其他字符就直接追加,讀到空格就追加%20。

如果用C語言,字符串以char[]來存,就要考慮更多的東西,比如數組的容量,挪動各個char,最後的\0等。

一種思路是從前往後讀,碰到空格,就先把後面的全部內容往後挪兩格,加入%20。這樣會導致很多內容被多次挪動,O(n^2)效率。
另一種思路是,預先掃一遍看有多少個空格,從而知道最終結果的長度,然後從後往前進行替換,預留出恰好的空間。這樣每個字符只需要挪動一次,O(n)效率即可。

需要特別注意\0、空指針、容量不足以及數組邊界的問題。

# python第一印象這樣寫,但是,字符串是不可變的!!!!
rep = '%20'
def solution(str):
    for i in range(len(str)):
        if str[i] == ' ':
            str[i] = str[i].replace(' ', rep)
    return str
if __name__ == '__main__':
    str = 'We Are Happy'
    print(solution(str))

# 所以可以考慮使用列表存儲字符串
rep = '%20'
list1 = []
def solution(str):
    global list1
    for i in str:
        list1.append(i)
    for i in range(len(str)):
        if list1[i] == ' ':
            list1[i] = list1[i].replace(' ', rep)
    return list1
if __name__ == '__main__':
    str = 'We Are Happy'
    print(solution(str))

# 進一步可以寫爲

rep = '%20'
list1 = []
def solution(str):
    global list1
    for i in range(len(str)):
        list1.append(str[i])
        if list1[i] == ' ':
            list1[i] = list1[i].replace(' ', rep)
    return list1

if __name__ == '__main__':
    str = 'We Are Happy'
    print(solution(str))
    

在線版本

# -*- coding:utf-8 -*-
class Solution:
    # s 源字符串
    def replaceSpace(self, s):
        # write code here
        list1 = []
        for i in range(len(s)):
            list1.append(s[i])
            if list1[i] == ' ':
                list1[i] = '%20'
        return "".join(list1)
# 使用c的解答
class Solution {
public:
	void replaceSpace(char *str,int length) {
        //length是字符數組的總容量大小,而不是字符串的長度。
        //遍歷一遍字符串找出空格的數量
        if(str==NULL||length<0)
            return ;
        int i=0;
        int oldnumber=0;//記錄以前的長度
        int replacenumber=0;//記錄空格的數量
        while(str[i]!='\0')
            {
               oldnumber++;
               if(str[i]==' ')
                   {
                     replacenumber++;
                   }
                  i++; 
            }
        int newlength=oldnumber+replacenumber*2;//插入後的長度
        if(newlength>length)//如果計算後的長度大於總長度就無法插入
            return ;
        int pOldlength=oldnumber; //注意不要減一因爲隱藏個‘\0’也要算裏
        int pNewlength=newlength;
        while(pOldlength>=0&&pNewlength>pOldlength)//放字符
            {
              if(str[pOldlength]==' ') //碰到空格就替換
                  {
                     str[pNewlength--]='0';
                     str[pNewlength--]='2';
                     str[pNewlength--]='%';
                  }
               else //不是空格就把pOldlength指向的字符裝入pNewlength指向的位置
               {
                    str[pNewlength--]=str[pOldlength];
               }
             pOldlength--; //不管是if還是elsr都要把pOldlength前移
           }
	}
};

這裏感覺值得一提的是書中特別寫出了測試用例:

  • 輸入的字符串中包含空格:空格在開頭、最末、中間、連續多個空格
  • 輸入的字符串中沒有空格
  • 輸入空指針、空串、只有一個空格、全爲空格等特殊情況

在寫代碼時感覺 應該先想好這些各種情況,保證對各種特殊情況都考慮到了,才能使得寫出的代碼儘可能正確。

依據首字母將單詞表進行歸類

# 通過起始字母,將一個列表中的單詞分類
words = ['apple', 'bat', 'bar', 'atom', 'book']
by_letter = {}
for word in words:
    letter = word[0]
    if letter not in by_letter:
        by_letter[letter] = [word]
    else:
        by_letter[letter].append(word)
print(by_letter)

# 或者
# 使用setdefault()方法
for word in words:
    letter = word[0]
    by_letter.setdefault(letter, []).append(word)
by_letter

逆序輸出列表

# 編寫函數實現列表的逆序輸出
def reverse01(list1):
    return list1[::-1]
if __name__ == '__main__':
    list1 = [0,1,2,3,4]
    print(reverse01(list1))

# 或者使用reversed()
# 測試reversed函數
list1 = ['x','y',1,2,2,3,4,5,6]
list2 = list(reversed(list1))
print(list2)

倒序輸出鏈表

class Solution:
    # 返回從尾部到頭部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here
        ls = []
        head = listNode
        while head:
            ls.insert(0, head.val)
            head = head.next
        return ls

題目描述
輸入一個鏈表,從尾到頭打印鏈表每個節點的值。

思路
1)倒置指針——會改變原始輸入信息,需注意是否允許改變原數據
2)基於遞歸實現——先輸出內層的,注意當鏈表很長時會導致調用棧溢出
3)基於棧,用循環實現

code

class Solution:
    # 返回從尾部到頭部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here
        if not listNode:
            return []
        stack = []
        current = listNode
        while(current is not None):
            stack.append(current.val)
            current = current.next
        result = []
        
        # 注意range的使用
        for i in range(len(stack)-1, -1, -1):
            result.append(stack[i])
        return result

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章