關於騰訊的那道題擷取字串的題

2021-09-30 07:11:39 字數 2159 閱讀 2608

題目是:

假設有"123abc456def789"這麼乙個字串,寫乙個函式,可以傳入乙個字串,和乙個要擷取的長度。返回擷取後的結果。

要求:1 和標記不得計算在長度之內。

2 擷取後的字串,要保留原有標籤,不過如果最後有乙個標籤沒有閉合,則去掉其開始標籤。

示例:題中的字串,要擷取長度5,則返回的字串應該為:123ab,要擷取長度8,應返回123abc45。

我的做法大概思路是:

1 首先順序讀取字串,並用乙個resultstr變數來記錄所有字元,當發現《標記時,開始將這個子字串用tag變數記錄下來。

2 如果發現tag變數形式為也就是html標籤的開始標記),就將其入棧。用棧結構來儲存這個標記。若遇到(html標籤的結束標記),就出棧。

3 否則如果是常規字元的話,長度計數器++。直到與傳入的要擷取長度相等。

4 最後判斷棧是否為空,如果為空,直接返回擷取後的字串,否則,將棧中剩餘元素乙個個出棧,迴圈從擷取後的字串中查詢棧頂標籤元素最後一次出現的位置,返回索引,將這個標籤替換為空。直到整個棧為空為止。最後返回處理後的字串。

原題其實是沒有考慮標籤巢狀的情況的,我盡量的讓程式可以處理巢狀標籤,使其更健壯。並且盡量少的去用php的內建函式,因為那樣可能會掩蓋演算法本身。如可以處理a1b2c3d4

e5這種形式的巢狀標籤。但我發現如果標籤是這種不規則形式a1b2c3d4

e5的話,程式就會出問題了。因為我只將取到的結束標記與棧頂的元素相比較,而沒有去迴圈搜尋整個棧。這裡要改一下其實也可以。

不知大家還有沒有其他思路,我感覺我這麼做實在是太麻煩了,羅羅嗦嗦一大堆。這麼多**面試時拿筆寫非得瘋了不可。而且這個時間複雜度不理想,大概為o(n*(n2))。空間方面也佔了很多多餘的空間。我相信一定有很簡單的辦法。希望大家一起想想有什麼更簡單的方法沒?

php code

<?

phpfunction

mysubstr(

$str

,$length

)

$tagcnt++;

$length++;

$tag.='

>';

//如果是開始標記,則入棧,如果是與之相對應的結束標記則出棧

if(

preg_match('

/<([^//]+)?>/i',

$tag,$r

) )

elseif

( preg_match( '

/'.$tagstack

[count

($tagstack)-

1].'

/',$tag

) )

$tag=''

;

continue

; }

$charcnt++;

$resultstr

.=$str[$i

]; }

echo

'最後結果為:';

//棧是空的直接返回if(

empty

($tagstack

))

//否則去掉沒有結束標記的開始標記

else

$resultstr[$i

++] =''

;

}return

$resultstr

; }

}$sttime

=microtime

(true

);$stmem

=memory_get_usage();

$str="

a1b2c3d4e5

f6g7h8";

echo

'處理結果為:',

htmlspecialchars

( mysubstr(

$str,18

) ),''

;echo

"記憶體使用情況:",

(memory_get_usage()

-$stmem),

'';echo

"演算法執行時間(microtime):",

(microtime

(true)-

$sttime),

' '

;

程式設計題 按位元組擷取字串

talk is cheap,show me the code.編寫乙個擷取字串的函式,輸入為乙個字串和位元組數,輸出為按位元組擷取的字串。但是要保證漢字不被截半個,如 我abc 4,應該截為 我ab 輸入 我abc漢def 6,應該輸出為 我abc 而不是 我abc 漢的半個 輸入描述 輸入待擷取的...

一道關於字串處理的題

題目要求 按要求分解字串,輸入兩個數m,n m代表輸入的m串字串,n代表輸出的每串字串的位數,不夠補0。例如 輸入2,8,abc 123456789 則輸出為 abc00000 12345678 90000000 include include include include include inc...

c 擷取字串後幾位 C 幾種擷取字串的方法小結

c 幾種擷取字串的方法小結,需要的朋友可以參考一下 1.根據單個分隔字元用split擷取 例如string st gt123 1 string sarray st.split 即可得到sarray 0 gt123 sarray 1 1 2.利用多個字元來分隔字串 例如string str gtazb...