題目是:
假設有"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...