Java Iterator 实现杨辉三角

 一、问题描述

杨辉三角定义如下:

          1/ \1   1/ \ / \1   2   1/ \ / \ / \1   3   3   1/ \ / \ / \ / \1   4   6   4   1/ \ / \ / \ / \ / \
1   5   10  10  5   1

 把每一行看做一个list,试写一个 Iterator,不断输出下一行的 list:

# 期待输出:
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

 二、思路分析

我们先从第二行开始,看一下更通用的序列生成过程:

1、首尾两个元素固定是1

2、下一行的序列生成依赖于上一行

3、下一行实际需要生成的元素个数,是上一行序列长度-1

就比如

[1,1] -> [1,2,1]   L = [1,1]    2 = L[0]+L[1]    result = [1]+[2]+[1]=[1,2,1] 需要生成 2 一个元素

List<Integer> in = Arrays.asList(1,1);
List<Integer> out = new ArrayList<>();
out.add(1);
for (int i = 0; i < ( in.size()-1); i++) {out.add(in.get(i)+in.get(i+1));
}
out.add(1);
System.out.println(out);

[1,2,1] -> [1,3,3,1]   L = [1,2,1]    3 = L[0]+L[1]   3 = L[1]+L[2]  result = [1]+[3,3]+[1] 需要生成 3,3 两个元素

List<Integer> in = Arrays.asList(1,2,1);
List<Integer> out = new ArrayList<>();
out.add(1);
for (int i = 0; i < ( in.size()-1); i++) {out.add(in.get(i)+in.get(i+1));
}
out.add(1);
System.out.println(out);

 

从 [1] -> [1,1] 是否也符合这个表达式呢?

List<Integer> in = Arrays.asList(1);
List<Integer> out = new ArrayList<>();
out.add(1);
for (int i = 0; i < ( in.size()-1); i++) {out.add(in.get(i)+in.get(i+1));
}
out.add(1);
System.out.println(out);

至此,除了杨辉三角的第一行序列 [1],我们得到了一个通用的表达式,第一行序列 [1],就让它直接返回就好。

if (idx==0) {return in;
}
List<Integer> out = new ArrayList<>();
out.add(1);
for (int i = 0; i < ( in.size()-1); i++) {out.add(in.get(i)+in.get(i+1));
}
out.add(1);
return out;

 三、代码实现

package com.study.algorithm;import java.util.*;public class TriangleIter implements Iterator<List<Integer>> {// 杨辉三角要展示几层private Integer n;private Integer idx = 0;private List<Integer> list = new ArrayList<>();public TriangleIter(Integer n) {this.n = n;// 初始化第一个列表 [1]list.add(1);}@Overridepublic boolean hasNext() {return idx < n;}@Overridepublic List<Integer> next() {list = generate(list);idx++;return list;}private List<Integer> generate(List<Integer> in) {if (idx==0) {return in;}List<Integer> out = new ArrayList<>();out.add(1);for (int i = 0; i < ( in.size()-1); i++) {out.add(in.get(i)+in.get(i+1));}out.add(1);return out;}public static void main(String[] args) {TriangleIter iter = new TriangleIter(10);while(iter.hasNext()){System.out.println(iter.next());}}
}

四、语言比较

我用 Python 写过杨辉三角的列表生成式:

L = [1] + [ L[i]+L[i+1] for i in range( len(L)-1 ) ] + [1]

 并尝试用 Java 的流式计算来实现:

List<Integer> out =
IntStream.concat(IntStream.of(1),IntStream.concat(IntStream.range(0, in.size() - 1).map(i -> in.get(i) + in.get(i + 1)),IntStream.of(1))
).boxed().collect(Collectors.toList());

 发现并没有比 for 循环简洁多少。

Python 的语言表达能力确实很强。

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

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

相关文章

解决注册Kaggle出现的“Captcha must be filled out”问题

首先&#xff0c;出现这个问题后&#xff0c;就搜索了一下别的博主的方法。 使用header editor 插件 首先&#xff0c;下载扩建&#xff1a; 然后进行重定向&#xff1a; 管理之后&#xff0c;输入下面的地址&#xff0c;然后下载-保存&#xff1a; 但是&#xff0c;这条显然…

【Python】 select模块详解 所有程序猿必看!!!

要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值。 select()方法接收并监控3个通信列表&#xff0c; 第一个是所有的输入的data,就是指外部发过来的数据&#xff0c;第2个是监控和接收所有要发出去的data(outgoing data),第3个监控错误信息 在网上一直在…

JavaIO流操作

目录 简介 字节输入流 获取字节输入流 读 关闭输入流 字节输出流 获取字节输出流 写 换行符 刷新 关闭输出流 字符流输入流 获取字符输入流 读 关闭输入流 字符输出流 获取字符输出流 写 换行符 刷新 关闭输出流 简介 IO流分为两大派系&#xff1a; …

大数据之Hadoop集群

Hadoop集群介绍&#xff1f;Hadoop集群的优缺点及应用场景&#xff1f;Hadoop集群搭建&#xff1f;Hadoop架构&#xff1f; Hadoop集群介绍 Hadoop集群是由多台计算机&#xff08;节点&#xff09;组成的一个分布式计算系统&#xff0c;主要用于处理大规模的数据集。以下是对Ha…

项目推荐:指针切换器

小编的inscode部署项目&#xff1a;割绳子游戏。 更多精彩内容见InsCode - 让你的灵感立刻落地~ 介绍一下项目。 引言 在现代用户界面设计中&#xff0c;鼠标指针的样式和行为对用户体验有着重要的影响。传统的鼠标指针样式&#xff08;如箭头、手形、等待图标等&#xff09…

D-ID 推出能模仿用户的头部动作以及实时互动的 AI 头像

D-ID 宣布推出两种新型 AI 头像 — — Express 和 Premium&#xff0c;旨在提升内容创作的灵活性和人性化。这些头像将为企业在营销、销售和客户支持等领域的视频制作提供便利。用户只需少量文本输入和视觉数据&#xff0c;即可生成更自然的商业视频。 Express 头像可以通过约一…

【C++系列】-----------内存管理

c内存管理&#xff08;涉及&#xff1a;数据在内存中的分布、new和delete使用、动态内存管理等&#xff09; 文章目录 c内存管理&#xff08;涉及&#xff1a;数据在内存中的分布、new和delete使用、动态内存管理等&#xff09;前言一、C/C内存分布二、C中动态内存管理2.1、 ne…

SpringBoot框架:作业管理系统构建之道

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的作业管理系统有管…

Linux字体更新 使用中文字体

问题描述&#xff0c;处理之前&#xff0c;中文乱码 处理后的结果 压缩需要上传的字体&#xff1a; 上传到LInux的字体目录&#xff0c;上传后解压出来 刷新字体&#xff1a; fc-cache -fv 测试是否正常 fc-list | grep "FontName"如果还不行 可以在代码里面指定字…

【书生.浦语实战营】——入门岛

【书生.浦语实战营】——入门岛_第一关_Linux基础 任务分布1. 本地vscode远程连接并进行端口映射端口映射What——何为端口映射How——怎么进行端口映射 2. Linux基础命令touch &#xff1a;创建文件mkdir &#xff1a;创建目录cd:进入 退出 目录pwd :确定当前所在目录cat:可以…

VirtualBox 解决虚拟机Cable Unplugged 无法上网问题

问题描述 VirtualBox 中的虚拟机无法上网&#xff0c;在虚拟机中查看网络设置显示 Cable Unplugged。 解决方案 选择VirtualBox 上方任务栏的控制->设置->网络&#xff0c;勾选接入网线即可解决。

win10下MMSegmentation自定义数据集

下载1.2.1版本: Releases open-mmlab/mmsegmentation GitHub 安装环境 本地torch环境为1.9.1 pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0" 报mmcv版本不匹配的问题,形如:MMCV==X.X.X is used but incompatible. Please inst…

CSS网格布局

前言 希望元素按照网格的方式进行布局&#xff0c;最简单的方式就是利用网格布局&#xff0c;如图所示&#xff1a; 网格布局 设置网格布局的核心属性&#xff1a; ① display: grid 设置容器为网格布局容器&#xff08;如果希望设置行内的网格容器&#xff0c;可以设置disp…

童年的玩具:燕麦时钟

也不知道是谁传下来的&#xff0c;燕麦时钟。 燕麦是野生的&#xff0c;通常在麦地里面的都被拔掉&#xff0c;但是土埂上面的还幸存下来。 这个燕麦成熟后&#xff0c;上面有个麦芒由直的变弯&#xff0c;越是90度&#xff0c;越成熟。 选一根90度的成熟麦芒。把下部插入一团…

如何在BSV区块链上实现可验证AI

​​发表时间&#xff1a;2024年10月2日 nChain的顶尖专家们已经找到并成功测试了一种方法&#xff1a;通过区块链技术来验证AI&#xff08;人工智能&#xff09;系统的输出结果。这种方法可以确保AI模型既按照规范运行&#xff0c;避免严重错误&#xff0c;遵守诸如公平、透明…

2024年还有多少人在使用PHP?

根据W3Techs的最新数据&#xff0c;2024年PHP仍然支持76.5%的网站&#xff0c;这一数字在一年内下降不到1%&#xff08;截至2023年为77.3%&#xff09;。 尽管这一数字有所下降&#xff0c;但这表明PHP仍然是Web开发中非常流行的语言。 根据JetBrains的调查&#xff0c;在过去…

在这里游玩和创造,见证实时互动和 AI 的融合爆发丨年末场 RTE Open Day@RTE2024 回顾

RTE2024 第十届实时互联网大会上周末在北京圆满结束了&#xff0c;不知道大家体验交流得如何&#xff1f;可能是因为本来入秋的北京悄然升温&#xff0c;又或者是那两天的观众都很热情&#xff0c;25-26 号的活动现场特别像是一场夏天的聚会。 RTE Open Day 马不停蹄来到了第五…

智能体联手微信,打造24小时在线的全能AI机器人,除了聊天,还能接商单

最近在我们的智能体学习群里&#xff0c;微信AI机器人成了小明星&#xff0c;它功能丰富&#xff0c;机智幽默&#xff0c;成为了大家的心头好&#x1f617; 比如&#xff0c;它会非常热情的欢迎新入群的小伙伴&#xff0c;并且能够很机智的将小伙伴的名字巧妙地融入到欢迎词中…

采购退料单集成方案:从旺店通到金蝶云的API实现

14-采购退料单集成方案&#xff1a;旺店通旗舰奇门数据集成到金蝶云星空 在企业的供应链管理中&#xff0c;采购退料单的高效处理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将旺店通旗舰奇门的数据无缝对接到金蝶云星空。本次分享的案例…

MyBatis的高级映射及延迟加载

多对一&#xff1a; 多种方式&#xff0c;常见的包括三种&#xff1a; 第一种方式&#xff1a;一条SQL语句&#xff0c;级联属性映射。 第二种方式&#xff1a;一条SQL语句&#xff0c;association。 第三种方式&#xff1a;两条SQL语句&#xff0c;分步查询。&#xff08;这…