一、查找最大值
二、翻转列表
三、插入排序
%%-----------------------------------------------------------------------------------------------
%% @doc
%% 插入排序,从小到大,sort函数实现一遍插入排序。O(N2)
%% @end
%%-----------------------------------------------------------------------------------------------
insert_sort(OldList) ->
insert_sort([],OldList).
insert_sort(NewList,[H|T]) ->
Result = sort(H, NewList), %% 把每个元素按序插入到新列表中,返回新列表
insert_sort(Result,T);
insert_sort(NewList,[]) ->
NewList.
%% 一个元素插入当前新列表
sort(Num, []) ->
[Num]; %% 终止条件:当新列表循环到最后一个元素,从最后一个元素开始返回,然后++,直到列表第一个元素
sort(Num, [H|T]) ->
if Num > H ->
[H] ++ sort(Num,T);
true ->
[Num] ++ [H|T]
end.
四、冒泡排序
%%-----------------------------------------------------------------------------------------------
%% @doc
%% 依次比较相邻的两个数,将小数放在前面,大数放在后面O(N2)
%% @end
%%-----------------------------------------------------------------------------------------------
bubble_sort(OldList) ->
bubble_sort(OldList, length(OldList)-1).
bubble_sort(NewList,0) ->
NewList;
bubble_sort([H|T], N) ->
Result = bubble_once(H,T),
bubble_sort(Result,N-1).
bubble_once(Num,[]) -> [Num];
bubble_once(Num, [H|T]) ->
if
Num > H ->
[H] ++ bubble_once(Num,T);
true ->
[Num] ++ bubble_once(H,T)
end.
五、快排
nlogn
思想:分治、递归,把问题细分成小的问题,然后递归实现
六、反转输出字符串,并移除其中的空格
七、快速判断一个数是否是素数的方法
八、道具升级演算,只扣满级前所需道具
calculate_wardrobe_lv(WardrobeLv, WardrobeExp, WardrobeId, Conf, [{GoodsTypeId, Num} | T], CostGoodsList) ->
if
Num =< 0 ->
calculate_wardrobe_lv(WardrobeLv, WardrobeExp, WardrobeId, Conf, T, CostGoodsList);
true ->
HightestLv = lists:max(data_tupo:get_domain_wardrobe_lv_list()),
{_, GoodsAddExp} = lists:keyfind(GoodsTypeId, 1, Conf),
#record_domain_wardrobe{exp = UpgradeNeedExp} = data_tupo:get_domain_wardrobe_info(WardrobeId, WardrboeLv),
if
WardrobeLv >= HightestLv ->
{WardrobeLv, 0, CostGoodsList, [{GooodsTypeId, Num} | T]};
true ->
NewWardrboeLv = ?IF(GoodsAddExp + WardrobeExp >= UpgradeNeedExp, WardrobeLv + 1, WardrobeLv),
NewWardrobeExp = ?IF(GoodsAddExp + WardrobeExp >= UpgradeNeedExp, GoodsAddExp + WardrobeExp - UpgradeNeedExp, GoodsAddExp + WardrobeExp)
end;
calculate_wardrobe_lv(WardrobeLv, WardrobeExp, _WardrobeId, _Conf, [], CostGoodsList) ->
{WardrobeLv, WardrobeExp, CostGoodsList, [}.
九、经验等级演算
calculate_domain_lv (AddTotalExp, DomainLv, DomainExp, DomainId) ->
MaxDomainLv = lists:max(data_tupo:get_domain_lv_info(DomianId)),
if
DomainLv >= MaxDomainLV ->
{MaxDomainLv, 0};
true ->
#record_doamin_info{exp = UpNeedExp} = data_tupo:get_domain_info(DomainId, DomainLv),
if
AddTotalExp + DomainExp >= UpNeedExp ->
calculate_domain_lv(AddTotalExp + DomainExp -UpNeedExp, DomainLv + 1, 0, DomainId);
true ->
{DomainId, AddTotalExp + DomainExp}
end
end.
十、经验等级演算
%% 兑换演算,返回ExGoodsList,NewScore, NewExList
exchange_goods ([], ExGoodsList, NewExList, NewScore) ->
{ExGoodsList, NewExList, NewScore};
exchange_goods ([H|T], ExGoodsList, NewExList, NewScore) ->
{Index, GoodsId, GoodsNum, NeedScore, LimitNum} = H,
CurExchangeTimes = proplists:get_value(Index, NewExList, 0),
if
%%-----兑换次数是否已达上限
CurExchangeTimes >= LimitNum ->
exchange_goods(T, ExGoodsList, NewExList, NewScore);
%%-----可兑换次数不可超过限制次数
true ->
%%
CanExTimes = NewScore div NeedScore,
CanExTimes1 = ?IF_ELSE(CanExTimes + CurExchangeTimes >= LimitNum, LimitNum, CanExTimes),
ExGoodsList1 = ?IF_ELSE(CanExTimes1 == 0, ExGoodsList, [{GoodsId, GoodsNum * CanExTimes1} | ExGoodsList]),
NewExList0 = case lists:keyfind(Index, 1, NewExList) of
false ->
lists:keystore(Index, 1, NewExList, {Index, CanExTimes1});
{_, AlExTimes} ->
lists:keystore(Index, 1, NewExList, {Index, AlExTimes + CanExTimes1})
end,
NewExList1 = ?IF_ELSE(CanExTimes1 == 0, NewExList, NewExList0),
NewScore1 = NewScore - CanExTimes1 * NeedScore,
exchange_goods(T, ExGoodsList1, NewExList1, NewScore1)
end.