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开发框架,具有容易上手,界面美观,多平台…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...