erlang练习题(三)

题目一

查询列表A是否为列表B的前缀

解答

isPrefix([], List2) -> io:format("A is prefix of B ~n");isPrefix([H1 | ListA], [H2 | ListB]) ->case H1 == H2 oftrue -> isPrefix(ListA, ListB);false -> io:format("A is not prefix of B ~n")end.

题目二

接受一个整数列表作为参数,返回一个新列表,其中的元素为原列表中所有出现至少两次的元素

解答

getTwice(List) ->getTwice(List, []).getTwice([], Acc) -> Acc;getTwice([Item | Rest], Acc) ->%% 当前元素在后面有重复出现,且在结果列表中没出现过,就加入case lists:member(Item, Rest) and not lists:member(Item, Acc) oftrue -> getTwice(Rest, [Item | Acc]);false -> getTwice(Rest, Acc)end.

题目三

判断列表A是否在列表B中出现,出现则输出在B列表第几位开始(例如[3,5,7,3]在[8,3,5,3,5,7,3,9,3,5,6,3]的第4位出现

解答

find_sublist_pos(_, []) -> not_found;find_sublist_pos(Sublist, B) ->find_sublist_pos(Sublist, B, 1).find_sublist_pos(Sublist, RestB, Pos) when length(RestB) < length(Sublist) ->not_found;find_sublist_pos(Sublist, RestB, Pos) ->case starts_with(Sublist, RestB) oftrue -> {found, Pos};false -> find_sublist_pos(Sublist, tl(RestB), Pos + 1) % tl获取列表的尾部集合(除了头元素的其他元素)end.%% 第一个列表是否为第二列表的前缀%% 空列表是任何列表的前缀starts_with([], _) -> true;starts_with(_, []) -> false;starts_with([H1 | T1], [H2 | T2]) when H1 =:= H2 ->starts_with(T1, T2);starts_with(_, _) -> false. %% 元素值不同,为false

题目四

在一个全部元素为{Key, Value}元组结构的元组或列表中,查找列表或元组中第一个

符合指定键的元素

例如:在[{a, 1}, {b, 2}, {c, 3}, {a, 4}] 如果查找第一个a为键的元素即输出 {a, 1}

解答

findfirstkey_a([]) -> false;findfirstkey_a([Head | Rest]) ->{Key, Val} = Head,case Key == 'a' oftrue -> Head;false -> findfirstkey_a(Rest)end.

题目五

在一个全部元素为{Key, Value}元组结构的元组或列表中,用列表输出查找到的列表或元组中全部指定键的元素

例如:在[{a, 1}, {b, 2}, {c, 3}, {a, 4}] 如果查找全部a为键的元素即输出 [{a, 1}, {a, 4}]

解答

findkey_a(List) ->findkey_a(List, []).findkey_a([], Acc) -> Acc;findkey_a([Head | Rest], Acc) ->%io:format("Head = ~p~n Acc = ~p~n", [Head, Acc]),{Key, _} = Head,case Key == 'a' oftrue -> findkey_a(Rest, [Head | Acc]);false -> findkey_a(Rest, Acc)end.

题目六

在一个全部元素为{Key, Value}元组结构的元组或列表中,删除列表或元组中第一个符合指定键的元素且输出时不改变顺序

例如:在[{a, 1}, {b, 2}, {c, 3}, {a, 4}] 如果删除第一个a为键的元素即输出 [{b, 2}, {c, 3}, {a, 4}]

解答

deletefirstkey_a(List) ->

deletefirstkey_a(List, [], false). % 第三个参数表示是否出现过了a

deletefirstkey_a([], Acc,_) -> Acc;

deletefirstkey_a([{Key, _} | Rest], Acc, false) when Key =:= a->

deletefirstkey_a(Rest, Acc, true);

deletefirstkey_a([Head | Rest], Acc, true) ->

deletefirstkey_a(Rest, [Head | Acc], true).

题目七

在一个全部元素为{Key, Value}元组结构的元组或列表中,替换列表或元组中第一个符合指定键的元素且输出时不改变顺序

例如:输入列表[{a, 1}, {b, 2}, {c, 3}, {a, 4}] 查找键为a,值替换为10

即输出[{a, 10}, {b, 2}, {c, 3}, {a, 4}] 46

解答

replacefirstkey_a(List) ->

replacefirstkey_a(List, [], 0). % 第三个参数表示是否出现过了a

replacefirstkey_a([], Acc,_) -> lists:reverse(Acc);

replacefirstkey_a([{Key, _} | Rest], Acc, 0) when Key =:= a->

replacefirstkey_a(Rest, [{Key, 10}|Acc], 1);

%% 第一次插入后,即便 Key为 a ,也不会再走上面的逻辑

replacefirstkey_a([Head | Rest], Acc, _) ->

replacefirstkey_a(Rest, [Head | Acc], 1).

题目八

生成含有指定数量元素的元组,每个元素为随机integer元素, 要求元素不能有重复的(可以使用API)

解答

gen_int(N) ->

gen_int(N, []).

gen_int(0, Acc) -> {tuple, lists:reverse(Acc)};

gen_int(N, Acc) ->

Random = rand:uniform(10000),

case lists:member(Random, Acc) of

true -> gen_int(N, Acc);

false -> gen_int(N - 1, [Random | Acc])

end.

题目九

在一个全部元素为{Key, Value}元组结构的元组或列表中,将列表中相同key的值进行合并

例如:[{a,1},{b,2},{c,3},{b,4},{b,5},{c,6},{d,7},{d,8}] 输出 [{a,1},{b,11},{c,9},{d,15}]

解答

mergekv(List) ->

mergekv(List, maps:new()).

mergekv([], AccMap) -> maps:to_list(AccMap);

mergekv([{Key, Value} | T], AccMap) ->

io:format(“{p,p}~n”, [Key, Value]),

NewValue = case maps:is_key(Key, AccMap) of

​ true -> maps:get(Key, AccMap) + Value;

​ false -> Value

​ end,

NewAccMap = maps:put(Key, NewValue, AccMap), % 注意要用一个新的变量接受结果

mergekv(T, NewAccMap).

题目十

1、对相同类型的数据进行拼接,如:

binary:<<1,2>><<3,4>> 拼接后为 <<1,2,3,4>> 未完成

tuple:{a,b},{c} 拼接后为 {a,b,c}

list:[10],[20] 拼接后为 [10,20]

解答

%% 无法执行!!!

concat_binary(Binary1, Binary2) ->

Size1 = size(Binary1),

Size2 = size(Binary2),

NewSize = Size1 + Size2,

NewBinary = <<0:NewSize/unit:8>>,

NewBinary = binary_concat(Binary1, Binary2, NewBinary, 0, Size1),

NewBinary.

binary_concat(_, _, NewBinary, Size, Size) ->

NewBinary;

binary_concat(Binary1, Binary2, NewBinary, Index, Size1) when Index < size(Binary2) ->

Byte = binary_part(Binary2, Index, 1), % 从Binary2中从Index位置开始提取1长度的数据

UpdatedBinary = setelement(Size1 + Index + 1, NewBinary, Byte),

binary_concat(Binary1, Binary2, UpdatedBinary, Index + 1, Size1).

%% Tuple

concat_tuple(Tuple1, Tuple2) ->

concat_tuple(Tuple1, Tuple2, size(Tuple1), size(Tuple2), {}).

concat_tuple(Tuple1, Tuple2, 0, 0, AccTuple) ->

AccTuple;

%% 将Tuple1拼接到新元组中

concat_tuple(Tuple1, Tuple2, Index1, Index2, AccTuple) when Index1 > 0 ->

NewTuple = erlang:append_element(AccTuple, element(Index1, Tuple1)),

concat_tuple(Tuple1, Tuple2, Index1 - 1, Index2, NewTuple);

%% 将Tuple2拼接到新元组中

concat_tuple(Tuple1, Tuple2, 0, Index2, AccTuple) ->

NewTuple = erlang:append_element(AccTuple, element(Index2, Tuple2)),

concat_tuple(Tuple1, Tuple2, 0, Index2 -1, NewTuple).

%% 列表的拼接

concat_list(List1, List2) ->

concat_list(List1, List2, []).

concat_list([],[], Acc) -> lists:reverse(Acc);

concat_list([H | T], List2, Acc) ->

concat_list(T, List2, [H | Acc]);

concat_list([], [H | T], Acc) ->

concat_list([], T, [H | Acc]).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147006.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络(一):概述

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或…

《CTFshow-Web入门》10. Web 91~110

Web 入门 索引web91题解总结 web92题解总结 web93题解 web94题解 web95题解 web96题解 web97题解 web98题解 web99题解总结 web100题解 web101题解 web102题解 web103题解 web104题解 web105题解总结 web106题解 web107题解 web108题解 web109题解 web110题解 ctf - web入门 索…

红外遥控器 数据格式,按下及松开判断

红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是家用电器广泛采用&#xff0c;并越来越多的应用到计算机系统中。 同类产品的红…

iOS 视频压缩 mov转mp4 码率

最近还是因为IM模块的功能&#xff0c;IOS录制MOV视频发送后&#xff0c;安卓端无法播放&#xff0c;迫不得已兼容将MOV视频转为MP4发送。 其中mov视频包括4K/24FPS、4K/30FPS、4K/60FPS、720p HD/30FPS、1080p HD/30FPS、1080p HD/60FPS&#xff01; 使用AVAssetExportSessi…

使用sqlmap获取数据步骤

文章目录 1.使用sqlmap获取所有数据库2.使用sqlmap获取当前连接数据库3.使用sqlmap获取当前数据库下所有表名4.使用sqlmap获取当前数据库下某个表下所有列名5.使用sqlmap获取当前数据库下某个表下指定字段的数据6.测试当前用户是否是管理员7.使用burpsqlmap批量检测8.脱库命令9…

zkLogin构建者的最佳实践和业务思考

随着zkLogin在Sui主网上线&#xff0c;构建者可以开始为其应用程序提供丝滑的帐户创建服务。与任何新技术集成一样&#xff0c;构建者需要考虑许多重要的问题&#xff0c;以降低风险并成功优化。 本文概述了其中一些考虑因素&#xff0c;并突出了zkLogin文档中提供的明确指导。…

二、机器学习基础知识:Python数据处理基础

文章目录 1、基本数据类型1.1 数字类型&#xff08;Number&#xff09;1.2 字符串类型&#xff08;String&#xff09;1.3 列表类型&#xff08;List&#xff09;1.4 元组类型&#xff08;Tuple&#xff09;1.5 字典类型&#xff08;Dictionary&#xff09;1.6 集合类型&#x…

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具&#xff0c;但在实际应用中&#xff0c;也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具&#xff0c;它们在功能、性能和易用性方面都具有独特优势&#xff0c;可以满足不同压力测试需求的选择。 一、Gat…

lvgl不能显示图片,但可以显示按键?

AT32F403A, IAR, ST7735S, LVGL8.3。 一、现象&#xff1a; 本来想着用LVGL做一个摄像头的显示功能 切换动态。可是死活实现不了功能。 因为移植好LVGL后&#xff0c;首先测试了显示按键&#xff0c;功能正常&#xff0c;以为是一切正常。在模拟器上调试效果完成后&#xf…

Scala第十三章节

Scala第十三章节 1. 高阶函数介绍 2. 作为值的函数 3. 匿名函数 4. 柯里化 5. 闭包 6. 控制抽象 7. 案例: 计算器 scala总目录 文档资料下载

IDEA git操作技巧大全,持续更新中

作者简介 目录 1.创建新项目 2.推拉代码 3.状态标识 5.cherry pick 6.revert 7.squash 8.版本回退 9.合并冲突 1.创建新项目 首先我们在GitHub上创建一个新的项目&#xff0c;然后将这个空项目拉到本地&#xff0c;在本地搭建起一个maven项目的骨架再推上去&#xff0…

Python集成开发环境(IDE):WingPro for Mac

WingPro for Mac是一款Python集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;它提供了一系列强大的工具和功能&#xff0c;帮助Python开发人员提高开发效率和质量。 WingPro for Mac拥有直观的用户界面和强大的调试器&#xff0c;可以帮助用户快速定位问题和修复错误…

12链表-双指针

目录 LeetCode之路——21. 合并两个有序链表 分析&#xff1a; LeetCode之路——19. 删除链表的倒数第 N 个结点 分析&#xff1a; LeetCode之路——21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的…

宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决

一、前言 宝塔反代openai官方API接口详细教程&#xff0c;实现国内使用ChatGPT502 Bad Gateway问题解决&#xff0c; 此方法最简单快捷&#xff0c;没有复杂步骤&#xff0c;不容易出错&#xff0c;即最简单&#xff0c;零代码、零部署的方法。 二、实现前提 一台海外VPS服务…

网络安全——自学(黑客)方法

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

云原生之使用Docker部署RSS阅读器Huntly

云原生之使用Docker部署RSS阅读器Huntly 一、Huntly介绍1.1 Huntly简介1.2 Huntly功能 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Huntly镜像五、部署Huntly5.1 创建挂…

Qt自定义菜单

Qt开发过程中&#xff0c;弹出菜单时我们一般使用QMenu,但是QMenu都是一条项固定的格式&#xff0c;如查想要自己的设计界面就没法使用默认的Action项了&#xff0c;因此我们得用自定义的QMenu。 本篇介绍使用自定义的QMenu设计出UI。我们使用QWidget QWidgetAction来实现。Q…

此芯科技加入百度飞桨硬件生态共创计划,加速端侧AI生态布局

近日&#xff0c;此芯科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称“此芯科技”&#xff09;与百度签署硬件生态共创计划合作协议&#xff0c;正式加入由百度发起的硬件生态共创计划。双方将共同推动端侧AI和大模型在个人计算、车载计算以及元宇宙计算等领域…

拒绝水文!八大排序(二)【适合初学者】冒泡排序和选择排序

文章目录 冒泡排序选择排序 大家好&#xff0c;我是纪宁。 这篇文章介绍八大排序中思路最简单&#xff0c;但效率也是最低的两种排序算法&#xff01; 冒泡排序 冒泡排序&#xff0c;可以说是每个人在接触编程时最先学会的一种排序。 冒泡排序基本思想 冒泡排序&#xff08;…

Rust 围炉札记

文章目录 一、安装二、文档 一、安装 rust 安装 卸载&#xff08;自定义路径&#xff09; Rust配置镜像源 Rust in Visual Studio Code Rust 官网 Rust 中文网 windows系统下Rust环境搭建以及vscode调试环境配置 二、文档 Rust 菜鸟教程 Rust 官方文档中文教程 Rust 包管理…