華為筆試—在字串A中刪除字串B中的全部字元
阿新 • • 發佈:2018-12-24
例如,輸入”They are students.”和”aeiou”,則刪除之後的第一個字串變成”Thy r stdnts.”。
思路:不可避免的是遍歷第一個字串,如果遍歷一個字元,都需要去第二個字串中查詢其存不存在,那麼複雜度會是O(nm),當然由於字元數有限,所以m是個常量。關於查詢速度最快的當然是hash表,對於8位字元,size=2^8足矣。
關於刪除字元,後面的字元要往前移,如果每刪除一個就移一次,O(n^2)這複雜度實在太高。
僅僅用快慢指標就可以搞定,這個方法非常有用,比如求解迴圈連結串列倒數第K個元素,中間元素.....。
初始化:快慢指標指向第一個字元
迴圈:如果快指標指的是不需要刪除的字元,將值賦給慢指標 後,快慢指標同時++;
如果快指標指向待刪除字元,那麼直接++;
終止:快指標指向'\0'
- /*
- * Copyright (c) 2011 alexingcool. All Rights Reserved.
- */
- #include <iostream>
- #define NUMBER 256
- usingnamespace std;
- char firstArray[] = "They are students.";
- char secondArray[] = "aeiou";
-
constint firstSize = sizeof
- constint secondSize = sizeof secondArray / sizeof *secondArray;
- bool flag[NUMBER];
- void deleteArray(char *firstArray, char *secondArray)
- {
- if(firstArray == NULL || secondArray == NULL)
- return;
- for(int i = 0; i < NUMBER; i++)
- {
-
flag[i] = false
- }
- for(int i = 0; i < secondSize; i++)
- {
- int pos = static_cast<int>(secondArray[i]);
- flag[pos] = true;
- }
- char *fast = firstArray, *slow = firstArray;
- while(*fast != '\0')
- {
- if(flag[*fast] == false)
- {
- *slow = *fast;
- slow++;
- }
- fast++;
- }
- *slow = 0;
- }
- int main()
- {
- deleteArray(firstArray, secondArray);
- cout << firstArray << endl;
- return 0;
- }