1. 程式人生 > >資料結構——演算法之(022)( 在字串中刪除特定的字元)

資料結構——演算法之(022)( 在字串中刪除特定的字元)

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]

題目:

輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入”They are students.”和”aeiou”, 則刪除之後的第一個字串變成”Thy r stdnts.”。這是一道微軟面試題。在微軟的常見面試題中,與字串相關的題目佔了很大的一部分,因為寫程式操作字串能很好的反映我們的程式設計基本功。

題目分析:

一、方法很多,這裡使用最優的解法:hash,複雜度為(m+n)

(1)因為是字串,所以可以申請一個hash[256]的陣列,然後把”aeiou”對映到其中

(2)遍歷”They are students.”,把每個字元取出在hash表中查詢

(3)在用兩個指標順序拷貝沒有刪除的字元即可,指標操作,看下面程式碼

演算法實現:

#include <stdio.h>
#include <string.h>
char * delete_chars(char *str, char *del_chars)
{
	char hash[256] = {0};
	
	int i=0;
	int str_len = strlen(del_chars);
	for(; i<str_len; ++i)
	{
		if(hash[del_chars[i]] == 0)
			hash[del_chars[i]] = 1;
	}
	
	char *pos = str;
	char *sp = str;
	str_len = strlen(str);
	while(str_len--)
	{
		if(!hash[*pos])
		{
			*sp++ = *pos;
		}
		pos++;
	}
	*sp = '\0';
	return str;
}

int main(int argc, char *argv[])
{
	printf("%s--%s---->", argv[1], argv[2]);
	printf("%s\n", delete_chars(argv[1], argv[2]));
	return 0;
}


相關推薦

資料結構——演算法022字串刪除特定字元

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]】 題目: 輸入兩個字串,從第一字串中刪除第二個字串中所有的字元。例如,輸入”They are students.”和”aeiou”, 則刪除之後的第

資料結構——演算法032求兩個串的第一個最長子串

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]】 題目: 求兩個串中的第一個最長子串(神州數碼以前試題).如"abractyeyt","dgdsaeactyey"的最大子串為"actyey".題目

資料結構——演算法033兩個有序單鏈表合併為一個有序的單鏈表

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]】 題目: 兩個有序單鏈表合併為一個有序的單鏈表(預設升序)題目分析: 1、因為兩個連結串列都是有序的,所以首先要記錄那個連結串列頭最小 2、大致

資料結構——演算法031字串所有小寫字母排在大寫字母的前面

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]】 題目: 函式將字串中的字元'*'移到串的前部分,前面的非'*'字元後移,但不能改變非'*'字元的先後順序,函式返回串中字元'*'的數量。題目分析:

資料結構——演算法023 單鏈表就地逆置,頭插法

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]】 題目: 單向連結串列的就地逆置 題目分析: 一、方法很多,這裡使用頭插法 (1)順序遍歷連結串列,並把每個節點從新插入在頭結點後面 (2)

Javascript資料結構演算法排序一氣泡排序,插入排序,選擇排序

在計算機中儲存的資料執行的兩種最常見操作是排序和檢索。 本次介紹的是氣泡排序,插入排序,選擇排序三種基本排序演算法。其中外迴圈會遍歷陣列每一項,內迴圈則用於比較元素。其中原理參考逝者如斯,不捨晝夜的部落格園。 網頁展示 程式碼部分

資料結構演算法題/最大子序列一維陣列中和最大的連續子序列

1首先看一下 最大子序列。 最大子序列是要找出由陣列成的一維陣列中和最大的連續子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,達到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已經看出來了,找最大子序列的方法很簡單,只要前i項的和還沒有

資料結構演算法題/最大子矩陣二維陣列中和最大的連續子矩陣

給定一個矩陣,都是整數,求出其中的最大子矩陣。 可以將問題轉換為求一維陣列的最大子序列和的問題。具體見https://blog.csdn.net/fkyyly/article/details/83088247 /** * 其實思想是控制新的子矩陣開始,按列相加變成一維陣列,然後再求一維陣列

資料結構學習二叉樹面試易考題整理

【摘要】電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。二叉樹是遞迴定義的,因此,與二叉樹有關的題目基本都可以用遞迴思想解決

資料結構實驗圖論四:迷宮探索(判斷連通圖

Problem Description 有一個地下迷宮,它的通道都是直的,而通道所有交叉點(包括通道的端點)上都有一盞燈和一個開關;請問如何從某個起點開始在迷宮中點亮所有的燈並回到起點? Input 連續T組資料輸入,每組資料第一行給出三個正整數,分別表示地下迷宮的結點數N(1 &l

"雙向連結串列"-資料結構演算法-通俗易懂,完全解析

1.概念的引入 相信大家都使用過各種集合來進行開發,但是較少的人會去研究其內部的儲存原理和呼叫方法,今天我就來帶大家一起學習資料結構演算法:雙向連結串列 首先我們先來了解什麼是快取,以及資料在記憶體中的儲存方式. 1.快取是什麼 如果cup讀取資料時

資料結構演算法C語言實現

單鏈表演算法大全(包含所有常見操作):單鏈表演算法連結 二叉樹演算法大全(包含所有常見操作):二叉樹演算法連結 矩陣無向圖演算法(生成、BFS、DFS):矩陣無向圖演算法連結 鄰接表無向圖

資料結構演算法題/兩個有序陣列的位數

有三種方法,時間複雜度分別是O(m+n) ,O(k),O(log(m+n)) 注意點: 判斷合併後的陣列的元素個數是奇數還是偶數 如果是奇數取中間值;如果是偶數取中間2個數的平均值。 兩種求中位數的方法: (1)方法1,判斷奇數個還是偶數個 if (lengthall % 2 == 0)

資料結構實驗連結串列:單鏈表重複元素的刪除

資料結構實驗之連結串列七:單鏈表中重複元素的刪除 按照資料輸入的相反順序(逆位序)建立一個單鏈表,並將單鏈表中重複的元素刪除(值相同的元素只保留最後輸入的一個)。 Input: 第一行輸入元素個數 n (1 <= n <= 15); 第二行輸入 n 個整數,保證在 int 範

資料結構基礎:最小生成樹演算法

轉自:http://www.cnblogs.com/edisonchou/p/4681602.html   圖(中):最小生成樹演算法 圖的“多對多”特性使得圖在結構設計和演算法實現上較為困難,這時就需要根據具體應用將圖轉換為不同的樹來簡化問題的求解。 一、生成樹與最小生成

資料結構基礎:圖的遍歷演算法

轉自:http://www.cnblogs.com/edisonchou/p/4676876.html   圖(中):圖的遍歷演算法 上一篇我們瞭解了圖的基本概念、術語以及儲存結構,還對鄰接表結構進行了模擬實現。本篇我們來了解一下圖的遍歷,和樹的遍歷類似,從圖的某一頂點出發訪問

排序演算法選擇排序關鍵詞:資料結構/演算法/排序演算法/選擇排序

假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 選擇排序演算法 程式碼 from swap import swap def select_sort(nums): n = len(nums) i = 0 while

排序演算法插入排序關鍵詞:資料結構/演算法/排序演算法/插入排序

假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 插入排序演算法 程式碼 def insert_sort(nums): i = 1 n = len(nums) while i <= n-1: j = i

排序演算法氣泡排序關鍵詞:資料結構/演算法/排序演算法/氣泡排序

假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 氣泡排序演算法 程式碼 from swap import swap def bubble_sort(nums): n = len(nums) for i in rang

資料結構演算法連結串列篇

連結串列作為一種基礎的資料結構之一,我們會常常使用到它,接下來就讓我們一起學習吧。 1、連結串列的經典應用場景: LRU快取淘汰演算法。 2、快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非常廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。