一道Erlang測試題的多種解法

2021-07-05 13:09:04 字數 3276 閱讀 3571

題目:

remove '<','>' in ""?

"" -> "******"

"******>" -> "******>"

""" -> "xx>>" -> "***"

題目解讀:要求程式設計將乙個字串中首尾配對的<>去掉。如""  -> "zhongsan hu"

有兩種解法:

1、採用遞迴演算法。先比較首尾是否配對,如果不配對則列印出整個佇列,如果配對,則去掉首尾,再對子佇列繼續進行遞迴計算。(遍歷次數多,效率偏低)

2、計算首部'<'個數,再計算尾部'>'個數,然後得到這兩都的最小值,根據佇列的長度及這首尾兩個數的最小值,可以得到所需要的佇列。

解法一原始碼如下:

-module(test).

-export([remove/1]).

remove(l) when is_list(l) =:= true ->

remove_pair(l, "<", ">");

remove(_l) -> "argument error: you should test a list!".

%% 遞迴刪除列表中首尾配對的兩個元素

remove_pair(l, head, end) ->

case check_list_tail_end(l, end) of

true when [hd(l)] =:= head

-> remove_pair(remove_list_head_and_tail(l), head, end);

_other -> l

end.

%% 刪除列表的頭尾兩個元素

remove_list_head_and_tail(l) when length(l) >= 2 ->

remove_list_head_and_tail(tl(l), );

remove_list_head_and_tail(_l) -> .

remove_list_head_and_tail([_h|t], result) when t =:= ->

lists:reverse(result);

remove_list_head_and_tail([h|t], result) when t =/=

-> remove_list_head_and_tail(t,[h|result]).

%%判斷尾部

check_list_tail_end([h|t], compareendlist) when h =/= ->

if t =:= ,[h] =:= compareendlist -> true;

t =:= ,[h] =/= compareendlist -> false;

t =/= -> check_list_tail_end(t, compareendlist)

end;

check_list_tail_end(l, _) when l =:= -> false.

解法二原始碼如下:

-module(test).

-export([remove/1]).

remove() -> ;

remove(l) ->

remove(l, $<, $>).

remove(l, head, end) ->

headcount = get_headcount(l, head),

endcount = get_endcount(l, end),

totalcount = length(l),

remove_headend(l, min(headcount, endcount),totalcount).

get_headcount(l, head) ->

get_headcount(l, head, 0).

get_headcount([h|t], head, count) ->

if t =:= , h =:= head -> count+1;

t =:= , h =/= head -> count;

head =/= h -> count;

head =:= h -> get_headcount(t, head, count+1);

true -> erlang:error("get_headcount error")

end.

get_endcount(l, end) ->

get_endcount(l, end, 0).

get_endcount([h|t], end, count) ->

if t =:= , h =:= end -> count+1;

t =:= , h =/= end -> 0;

h =:= end -> get_endcount(t, end, count+1);

h =/= end -> get_endcount(t, end, 0);

true -> erlang:error("get_endcount error")

end.

remove_headend(l, count,totalcount) ->

l1 = cut_head(l, count),

l2 = cut_end(l1, totalcount-2*count),

lists:reverse(l2).

cut_head(l, count) ->

cut_head(l, count, ).

cut_head(, _count, _l) -> ;

cut_head([h|t], count, l) ->

if

count =/= 0 -> cut_head(t, count-1, [h|l]);

true -> [h|t]

end.

cut_end(l, reservecount) ->

cut_end(l, reservecount, ).

cut_end(, _reservecount, resultlist) -> resultlist;

cut_end([h|t], reservecount, resultlist) ->

if reservecount =/= 0 -> cut_end(t, reservecount-1, [h|resultlist]);

true -> resultlist

end.

測試:"" -> "******"

"******>" -> "******>"

""" -> "xx>>>>" -> "hzhsan>"

騰訊的一道測試題

有36輛電單車6個賽道,在沒有計時器的情況下,如果要選出跑的最快的三輛車,至少需要幾次比賽?我最初的想法是 要選出最快的三輛車,先讓這36輛車分成6組,每一組比一下,選出每一組的第一名,然後讓這6個第一名比一次,選出前三名就行了,果斷的選擇了7次,顯然這是錯誤的 這個題和田忌賽馬有那麼一點點的相似,...

再試答一道招聘測試題 關於「客戶即上帝」理解

古人曰 冠雖敝,禮加之於首 履雖新,法踐行於地 請你 a 把這句古語譯成白話文,b 此句最早出自何處?歷史上哪幾個主要人物說過這樣的話。c 結合 客戶即上帝 的現代觀念,談談你對這句古語的理解。說來慚愧,我是理工科出身,古文功底不是很好,這句話也是第一次遇到,經過在網上查詢,才有如下一點結果。經查,...

試著解一道騰訊面試題

帖子問題 同學去面試的 1 設計乙個魔方 六面 的程式。2 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有重複。請用5分鐘時間,找出重複出現最多的前10條。3 收藏了1萬條url,現在給你一條url,如何找出相似的url。面試官不解釋何為相似 想了一中午,寫了一下午 真服了自己,這麼鑽牛...