怎么做58同城网站,微信小程序与微网站,wordpress 删除线,重点实验室网站建设的研究现状202309-2 坐标变换#xff08;其二#xff09; 题解1题解2区别第一种算法#xff08;使用ArrayList存储操作序列#xff09;#xff1a;数据结构#xff1a;操作序列处理#xff1a; 第二种算法#xff08;使用两个数组存储累积结果#xff09;#xff1a;数据结构其二 题解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数组ArrayListdouble[] op new ArrayList();// 初始化所有操作的累积倍数为1for (int i 0; i n; i) {op.add(new double[] {1, 0}); // 初始操作是不进行变换k1, sita0}// 读取每个操作的类型和值并存储到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数组ArrayListdouble[] op new ArrayList();// 初始化所有操作的累积倍数为1for (int i 0; i n; i) {op.add(new double[] {1, 0}); // 初始操作是不进行变换k1, sita0}// 读取每个操作的类型和值并存储到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存储操作序列
数据结构
使用了ArrayListdouble[]来存储操作序列。 每个操作是一个长度为2的double数组存储了操作的缩放倍数和旋转角度。
操作序列处理
在读取每个操作时将其存储为一个数组然后放入ArrayList中。 对每个操作序列进行遍历根据操作类型更新缩放倍数和旋转角度。 每次操作都要通过ArrayList的get和set方法来获取和更新操作可能需要多次遍历操作序列。
第二种算法使用两个数组存储累积结果
数据结构
使用两个数组double[] k和double[] sita来分别存储累积的缩放倍数和旋转角度。 k数组存储缩放倍数sita数组存储旋转角度。
操作序列处理
在读取每个操作时直接根据操作类型更新对应的数组元素。 操作序列处理时不需要遍历直接根据索引获取和更新操作。
对比
效率
第一种算法使用ArrayList操作时需要多次调用get和set方法可能会造成性能损失特别是在大量数据时。 第二种算法使用数组直接根据索引获取和更新操作更加高效。
简洁性
第一种算法使用了ArrayList需要定义和操作ArrayList代码相对复杂一些。 第二种算法直接使用数组代码结构更简洁。
可读性
两种算法在理解上都是相对清晰的但对于不熟悉ArrayList的人来说第二种算法可能更容易理解。 总体来说第二种算法使用数组直接存储累积结果更加高效和简洁而第一种算法使用了ArrayList可能会在性能上稍逊一些。在处理大量数据时第二种算法更为推荐。