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]).
相关文章:
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&quo…...
What Is A DNS Amplification DDoS Attack?
什么是 DNS 放大攻击? 域名系统 (DNS) 是用于在网站的机器可读地址(例如 191.168.0.1:80)和人类可读名称(例如 radware.com)之间进行解析的目录在 DNS 放大攻击中,攻击者…...
jvm笔记
好处: 跨平台 内存管理机制,垃圾回收功能 数组下标越界检查 多态 名词解释: jvm java虚拟机,是java程序的运行环境 jre jvm基础类库 jdk jre编译工具 javase jdkide工具 javaee javase应用服务器 jvm的内存结构: 程序…...
 
WPF中的控件
内容控件:label、border Window控件 Label控件 Border控件 内容控件 Button控件 点击取消按钮关闭程序;点击登录按钮打开BorderWindow窗口。 TextBox控件 PasswordBox控件 TextBlock控件 加载窗口时显示TextBlock中的内容 RadioButton控件 CheckBox控件…...
 
Java下对象的序列化和反序列化(写出和读入)
代码如下: public class MyWork {public static void main(String[] args) throws IOException, ClassNotFoundException {//序列化File f new File("testFile/testObject.txt");ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(…...
 
基于springboot的洗衣店订单管理系统
目录 前言 一、技术栈 二、系统功能介绍 顾客信息管理 店家信息管理 店铺信息管理 洗衣信息管理 预约功能 洗衣信息 交流区 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势&#x…...
Llama2部署踩坑
1、权重是.bin,但是报错找不到.safetensors 明明权重文件是.bin,但是却提示我缺少.safetensors。最后发现好像是 llama2-7b这个模型文件不行,必须要llama2-7b-chat这个模型才能读取的通,具体原因还暂不明确。...
 
Adams齿轮副
1.运动副 添加旋转副的时候,必须先物体后公共part(即此处的ground),最后再选择质心点 2.啮合点 啮合点marker的z轴必须是齿轮分度圆的切线方向 3.啮合点 两齿轮的旋转副,和啮合点,即cv marker ,必须属…...
Elasticsearch keyword 中的 ignore_above配置项
1. ignore_above 关于es mapping的keyword ignore_above配置项的解释如下: Do not index any string longer than this value. Defaults to 2147483647 so that all values would be accepted. 不会索引大于ignore_above配置值的数据,默认值2147483647字…...
RabbitMQ原理(一):基础知识
文章目录 1.初识MQ1.1.同步调用1.2.异步调用1.3.技术选型2.RabbitMQ2.1.安装2.2.收发消息2.2.1.交换机2.2.2.队列2.2.3.绑定关系2.2.4.发送消息2.3.数据隔离2.3.1.用户管理2.3.2.virtual host微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于…...
 
[Linux]Git
文章摘于GitHub博主geeeeeeeeek 文章目录 1.1 Git 简易指南创建新仓库工作流添加与提交推送改动 1.2 创建代码仓库git init用法讨论裸仓库 例子 git clone用法讨论仓库间协作 例子用法讨论栗子 1.3 保存你的更改git add用法讨论缓存区 栗子 git commit用法讨论记录快照…...
 
ChatGPT终于可以进行网络搜索 内容不再限于2021年9月前
微软和谷歌已经让旗下聊天机器人进行网上搜索,并提供原始材料的链接,以提高信息共享的可信度和范围。但是,ChatGPT迄今为止只接受了有时间限制的训练数据,这些数据仅限于从互联网上收集的2021年9月之前的信息。在周三的一系列推文…...
 
uni-app:实现页面效果1
效果 代码 <template><view><view class"add"><image :src"add_icon" mode""></image></view><view class"container_position"><view class"container_info"><view c…...
归一化和标准化的联系与区别及建议
归一化和标准化是数据预处理中常用的两种方法。它们都是为了调整数据的尺度,使得数据更符合我们的分析需求。虽然二者的目的相同但是具体实现方式和适用场景却有所不同。下面,我们来详细介绍-下它们的联系和区别。 一、联系 归一化和标准化都能够使得数据的尽度缩放到不同的…...
 
数据结构--栈的实现
数据结构–栈的实现 1.栈的概念和结构: 栈的概念:栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Las…...
 
第十章 异常
python使用异常的特殊对象管理程序执行期间发生的错误。每当发生错误时,python会创建异常对象。如果编写了处理该异常的代码,程序将继续运行;如果未处理,程序将显示traceback。 异常是使用try-except代码块处理的。使用try-excep…...
 
Rust冒泡排序
Rust冒泡排序 这段代码定义了一个名为 bubble_sort 的函数,接受一个可变的整数类型数组作为输入,然后使用嵌套的循环来实现冒泡排序。外部循环从数组的第一个元素开始迭代到倒数第二个元素,内部循环从数组的第一个元素开始迭代到倒数第二个元…...
 
麒麟信安服务器操作系统V3.5.2重磅发布!
9月25日,麒麟信安基于openEuler 22.03 LTS SP1版本的商业发行版——麒麟信安服务器操作系统V3.5.2正式发布。 麒麟信安服务器操作系统V3定位于电力、金融、政务、能源、国防、工业等领域信息系统建设,以安全、稳定、高效为突破点,满足重要行…...
密码技术 (1) - 对称密码
一. 前言 对称密码是指加密数据和解密数据使用的是相同的秘钥。发送者使用秘钥将加密后的数据发送给接受者,接收者收到数据后用相同的秘钥解密,恢复原始数据。 对称密码具有加密和解密快速的特点,适用于需要快速加密的场景,常用的…...
 
基于PYQT5的GUI开发系列教程【二】QT五个布局的介绍与运用
目录 本文概述 作者介绍 创建主窗口 水平布局 垂直布局 栅格布局 分裂器水平布局 分裂器垂直布局 自由布局 取消原先控件的布局的方法 尾言 本文概述 PYQT5是一个基于python的可视化GUI开发框架,具有容易上手,界面美观,多平台…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
 
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
 
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
 
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
 
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
 
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
 
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
