2024 ccfcsp认证打卡 2023 09 02 坐标变换(其二)

202309-2 坐标变换(其二)

  • 题解1
  • 题解2
  • 区别
    • 第一种算法(使用ArrayList存储操作序列):
      • 数据结构:
      • 操作序列处理:
    • 第二种算法(使用两个数组存储累积结果):
      • 数据结构:
      • 操作序列处理:
  • 对比
    • 效率
    • 简洁性
    • 可读性

在这里插入图片描述
在这里插入图片描述

题解1

import java.util.ArrayList;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt(); // 操作次数int m = scan.nextInt(); // 初始坐标个数// 存储操作序列的ArrayList,每个操作为长度为2的double数组ArrayList<double[]> op = new ArrayList<>();// 初始化所有操作的累积倍数为1for (int i = 0; i <= n; i++) {op.add(new double[] {1, 0}); // 初始操作是不进行变换,k=1, sita=0}// 读取每个操作的类型和值,并存储到op中for (int i = 1; i <= n; i++) {int type = scan.nextInt(); // 操作类型,1表示乘法,2表示加法double val = scan.nextDouble(); // 操作值if (type == 1) {// 如果是乘法操作,更新k值,sita不变op.set(i, new double[] {op.get(i - 1)[0] * val, op.get(i - 1)[1]});} else {// 如果是加法操作,更新sita值,k不变op.set(i, new double[] {op.get(i - 1)[0], op.get(i - 1)[1] + val});}}// 对每个初始坐标进行操作并输出结果for (int i = 0; i < m; i++) {int l = scan.nextInt(); // 左边界int r = scan.nextInt(); // 右边界double x = scan.nextDouble(); // 初始x坐标double y = scan.nextDouble(); // 初始y坐标// 计算从l到r的累积旋转角度和累积缩放倍数double sum_sita = op.get(r)[1] - op.get(l - 1)[1];double sum_k = op.get(r)[0] / op.get(l - 1)[0];// 根据公式计算最终的坐标double nx = x * Math.cos(sum_sita) - y * Math.sin(sum_sita);double ny = x * Math.sin(sum_sita) + y * Math.cos(sum_sita);// 输出结果System.out.println(nx * sum_k + " " + ny * sum_k);}scan.close();}
}

题解2

import java.util.ArrayList;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt(); // 操作次数int m = scan.nextInt(); // 初始坐标个数// 存储操作序列的ArrayList,每个操作为长度为2的double数组ArrayList<double[]> op = new ArrayList<>();// 初始化所有操作的累积倍数为1for (int i = 0; i <= n; i++) {op.add(new double[] {1, 0}); // 初始操作是不进行变换,k=1, sita=0}// 读取每个操作的类型和值,并存储到op中for (int i = 1; i <= n; i++) {int type = scan.nextInt(); // 操作类型,1表示乘法,2表示加法double val = scan.nextDouble(); // 操作值if (type == 1) {// 如果是乘法操作,更新k值,sita不变op.set(i, new double[] {op.get(i - 1)[0] * val, op.get(i - 1)[1]});} else {// 如果是加法操作,更新sita值,k不变op.set(i, new double[] {op.get(i - 1)[0], op.get(i - 1)[1] + val});}}// 对每个初始坐标进行操作并输出结果for (int i = 0; i < m; i++) {int l = scan.nextInt(); // 左边界int r = scan.nextInt(); // 右边界double x = scan.nextDouble(); // 初始x坐标double y = scan.nextDouble(); // 初始y坐标// 计算从l到r的累积旋转角度和累积缩放倍数double sum_sita = op.get(r)[1] - op.get(l - 1)[1];double sum_k = op.get(r)[0] / op.get(l - 1)[0];// 根据公式计算最终的坐标double nx = x * Math.cos(sum_sita) - y * Math.sin(sum_sita);double ny = x * Math.sin(sum_sita) + y * Math.cos(sum_sita);// 输出结果System.out.println(nx * sum_k + " " + ny * sum_k);}scan.close();}
}

区别

第一种算法(使用ArrayList存储操作序列):

数据结构:

使用了ArrayList<double[]>来存储操作序列。
每个操作是一个长度为2的double数组,存储了操作的缩放倍数和旋转角度。

操作序列处理:

在读取每个操作时,将其存储为一个数组,然后放入ArrayList中。
对每个操作序列进行遍历,根据操作类型更新缩放倍数和旋转角度。
每次操作都要通过ArrayList的get和set方法来获取和更新操作,可能需要多次遍历操作序列。

第二种算法(使用两个数组存储累积结果):

数据结构:

使用两个数组double[] k和double[] sita来分别存储累积的缩放倍数和旋转角度。
k数组存储缩放倍数,sita数组存储旋转角度。

操作序列处理:

在读取每个操作时,直接根据操作类型更新对应的数组元素。
操作序列处理时不需要遍历,直接根据索引获取和更新操作。

对比

效率

第一种算法使用ArrayList,操作时需要多次调用get和set方法,可能会造成性能损失,特别是在大量数据时。
第二种算法使用数组,直接根据索引获取和更新操作,更加高效。

简洁性

第一种算法使用了ArrayList,需要定义和操作ArrayList,代码相对复杂一些。
第二种算法直接使用数组,代码结构更简洁。

可读性

两种算法在理解上都是相对清晰的,但对于不熟悉ArrayList的人来说,第二种算法可能更容易理解。
总体来说,第二种算法使用数组直接存储累积结果,更加高效和简洁,而第一种算法使用了ArrayList,可能会在性能上稍逊一些。在处理大量数据时,第二种算法更为推荐。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unable to authenticate, need: BASIC realm=“Sonatype Nexus Repository Manager“

问题 使用公司的私有源&#xff0c;执行 npm i 的时候突然报错了&#xff1a; 解决 执行命令 npm config list找到 .npmrc 去掉对应的这一行即可&#xff0c;或者使用 nrm 工具执行 nrm del xxx 删掉私有源&#xff0c;然后在添加私有源也可。可以参考我这篇&#xff1a;使…

(一)基于IDEA的JAVA基础8

使用多重if选择结构 多个if条件进行判断: 语法: if(条件1){ 执行语句1&#xff1b; }else if(条件2){ 执行语句2&#xff1b; }else if(条件3){ 执行语句3&#xff1b; }else if (条件4)…… 流程图: 我们来写个好玩的&#xff0c;对暗号: public class Test01 { …

五分钟快速搭建个人游戏网站(1Panel)

五分钟快速搭建个人游戏网站&#xff08;1Panel&#xff09; 环境要求&#xff1a;主流 Linux 发行版本&#xff08;基于 Debian / RedHat&#xff0c;包括国产操作系统&#xff09;&#xff1b; 如果是Windows OS的可以通过WSL来实现安装。 1 介绍 1Panel 是一个基于 Web 的 L…

结构体讲解

目录 一.结构体类型的声明 (1)结构体的声明 (2)结构体的创建和初始化 (3)匿名结构体 (4)结构体的自引用 二.结构体内存对齐 (1)对齐规则 (2)为什么存在内存对齐&#xff1f; (3)结构体传参 三.结构体实现位段 (1)什么是位段 (2)位段的内存分配 (3)位段的跨平…

电脑桌面便签,怎么在电脑桌面上设置便签

在数字化时代&#xff0c;电脑已成为我们日常生活不可或缺的一部分。在我们使用电脑进行各种工作和学习的过程中&#xff0c;经常会遇到需要记录临时信息或提醒自己的情况。这时&#xff0c;设置便签在电脑桌面上就成为了一种非常便捷的方法。那么有一个问题&#xff0c;电脑桌…

2.8、下拉刷新与上拉加载

页面的下拉刷新与上拉加载功能在移动应用中十分常见,例如,新闻页面的内容刷新和加载。这两种操作的原理都是通过响应用户的触摸事件,在顶部或者底部显示一个刷新或加载视图,完成后再将此视图隐藏。 实现思路 以下拉刷新为例,其实现主要分成三步: 监听手指按下事件,记录…

每天学点儿python(1)---print,input和注释

print函数 print语法格式 print(*objects, sep , end\n, filesys.stdout) sep参数默认为 一个空格 end&#xff08;输出末尾&#xff09;参数默认为 回车换行 file默认为 标准输出&#xff08;一般指屏幕&#xff09; 所以&#xff0c;如果想输出各个字段不用空格隔开&a…

vue3+threejs新手从零开发卡牌游戏(七):创建卡组

在开始前先优化下之前的代码&#xff1a; 在之前hand/p1.vue中为了定位 utils文件夹下新建common.ts&#xff0c;将一些公用方法提取出来放在这里&#xff1a; 在game/Cards.ts中&#xff0c;我们调整下卡牌的厚度&#xff0c;由原来的0.02改为0.005&#xff0c;原因是之前的…

【Ucore操作系统】4. 地址空间

文章目录 【 0. 引言 】背景本章任务 【 1. C 中的动态内存分配 】1.1 C语言的内存分配1.2 kalloc 中的动态内存分配 【 2. 地址空间 】2.1 虚拟地址和地址空间2.1.1 地址虚拟化出现之前2.1.2 加一层抽象加强内存管理2.1.3 增加硬件加速虚实地址转换 2.2 分段内存管理2.2.1 等量…

Docker专题-04 Nginx部署

Docker专题-04 Nginx部署 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-03-21 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注…

javaSwing扫雷游戏

一、介绍 1.1 背景 在1964年 有一个叫“方 块”的游戏&#xff0c;这是扫雷最原始的版本。后来&#xff0c;这个游戏被改成了另一种游戏&#xff0c;叫做“Rlogic”。在这个游戏中&#xff0c;玩家扮演了一名军队的军人&#xff0c;接受了一项艰难的任务&#xff1a;为指挥中…

家政服务管理平台设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

【c++】类和对象(三)构造函数和析构函数

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们带来类和对象重要的部分&#xff0c;构造函数和析构函数 目录 1.类的6个默认成员函数2.构造函数2.1构造函数其他特性 3.构析函数3.1特性&#xff1a;…

sql——对于行列转换相关的操作

目录 一、lead、lag 函数 二、wm_concat 函数 三、pivot 函数 四、判断函数 遇到需要进行行列转换的数据处理需求&#xff0c;以 oracle 自带的表作为例子复习一下&#xff1a; 一、lead、lag 函数 需要行列转换的表&#xff1a; select deptno,count(empno) emp_num from…

【工具】DataX 数据同步工具

简介 DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databe…

基于java+springboot+vue实现的图书借阅系统(文末源码+Lw+ppt)23-328

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“期待相遇”图书借阅系统&#xff0c;帮助商…

代码随想录训练营第55天 | LeetCode 583. 两个字符串的删除操作、​​​​​​LeetCode 72. 编辑距离、总结

目录 LeetCode 583. 两个字符串的删除操作 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;LeetCode&#xff1a;583.两个字符串的删除操_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 72. 编辑距离 文章讲解&#xff1a;代码随想录(programm…

哪些行业需要在线制作电子证书系统?

哪些行业需要在线制作电子证书系统&#xff1f; 1、教育机构&#xff1a;学校和培训机构需要为学生和培训者颁发证书&#xff0c;您的系统可以帮助他们快速生成和管理这些证书。 2、企业及政府部门&#xff1a;用于员工培训、资质认证等&#xff0c;提高内部管理效率。 3、专…

小白如何兼职赚得第一桶金?六大网络赚钱方式让你轻松开启副业之旅

小白如何兼职赚得第一桶金&#xff1f;六大网络赚钱方式让你轻松开启副业之旅 无需担忧&#xff0c;以下是一些精心挑选的线上兼职建议&#xff0c;将助你迅速开启赚钱之旅。 1&#xff0c;参与网络调查&#xff1a;各大市场调研公司及品牌商常常需要了解消费者心声&#xff0c…

[BT]BUUCTF刷题第7天(3.25)

第7天 Web&#xff08;共5题&#xff09; [BJDCTF2020]Easy MD5 打开网站发现只有一个输入框&#xff0c;F12后也没有明显提示&#xff0c;但是在数据包中看到Hint&#xff1a;select * from admin where passwordmd5($pass,true)&#xff0c;意思是在admin表中查找password为…