算法的两个评測指标:执行时间和内存消耗

要么用时间换空间,要么用空间换时间

寻找数组同样元素測试一:

0~99共100个元素各不同样,新增加一个0~99的元素不明白位置

从101个元素数组中找出与0~99元素中反复的一个

/* 找同样元素
* 0~99共100个元素各不同样
* 从101个元素数组中找出与0~99元素中反复的一个
*/
public class Dome01 {
public static void main(String[] args) {
int arr[] = new int[101];
for (int i = 0; i < 100; i++) {
arr[i] = i;
}
arr[100] = 38; // 假定反复元素为38
// 将数组元素打乱 Math.random() 取值范围是[0,1) // 怎样打乱数据? ? for (int j = 0; j < 1000; j++) { // 进行1000次数据打乱的操作
int num1 = (int) (Math.random() * 101); // num取值范围是[0,101)
int num2 = (int) (Math.random() * 101);
int temp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = temp;
} // 算法一:用双循环实现
Jonney: for (int i = 0; i < arr.length; i++) {
// 将数组元素依次与后面的数组元素比較
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
System.out.println("反复元素是:" + arr[i]);
break Jonney; // 退出双循环
}
}
}
// 算法一效率太低 // 算法二:将数组的元素所有累加起来就是0~99的数据+同样元素 再减去0~99的和
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
for (int j = 0; j < 100; j++) {
sum -= j;
}
System.out.println("反复元素是:" + sum);
// 算法二假设计算的数据太多就会有数据溢出 // 算法三:使用异或解决
// 0^1^2^3^4^...^m...^99^m^0^1^2^3^4^...^m...^99=m
// 使用数组的第一个元素异或后面的所有元素
for (int i = 1; i < arr.length; i++) {
arr[0] = arr[0] ^ arr[i];
}
// 再次将arr[0]保存的结果与0~99异或一次
for (int i = 0; i < 100; i++) {
arr[0] = arr[0] ^ i;
}
System.out.println("反复元素是:" + arr[0]);
// 算法三才是最佳算法
}
}

寻找数组同样元素測试二:

0~99共100个整数,各不同样,将全部数放入一个数组,随机排布

数组长度100,将当中随意一个数替换成0~99还有一个数(唯一反复的数字)

将反复的数字找出

/*
* 0~99共100个整数,各不同样,将全部数放入一个数组,随机排布
* 数组长度100,将当中随意一个数替换成0~99还有一个数(唯一反复的数字)
* 将反复的数字找出
*/
public class Dome2 { public static void main(String[] args) {
int arr[] = new int[100];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
// 随机排布
for (int i = 0; i < 1000; i++) {
int num1 = (int) (Math.random() * 100);
int num2 = (int) (Math.random() * 100);
int temp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = temp;
}
// 用某个值给某个值替换
int num1 = (int) (Math.random() * 100);
int num2 = (int) (Math.random() * 100);
// 保证num1与num2不同
while (num1 == num2) {
num1 = (int) (Math.random() * 100);
}
System.out.println("将" + num1 + "位置的值用" + num2 + "的位置替换");
arr[num1] = arr[num2];
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
} // 算法实现:
// 算法一:用双循环实现
Jonney: for (int i = 0; i < arr.length; i++) {
// 将数组元素依次与后面的数组元素比較
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
System.out.println("反复元素是:" + arr[i]);
break Jonney; // 退出双循环
}
}
}
// 算法一效率太低 // 算法二:用数组优化的算法
// 定义一个新数组 int newArr[]=new int[100] 默认值为0
// 把原始数组的元素作为新数组的下标,假设该下标相应的新数组元素存在,就将该元素值+1=1
/*
* 原始数组 8 3 7 2 1 5 6 8 0
* 新数组 0 0 0 0 0 0 0 0 0
* 对新数组+1 1 1 1 1 0 1 1 1 2
*/
// 新数组中元素为2的值的下标就是反复元素
int newArr[] = new int[100];
for (int i = 0; i < arr.length; i++) {
newArr[arr[i]]++; // 将原始元素对于新数组的索引下标
if (newArr[arr[i]] == 2) {
System.out.println("反复元素是:" + arr[i]);
}
} } }

PS:測试二中的新定义个新数组的数组优化算法,尽管加快了查询速度。但也加大了内存开销

Java算法分析1—————寻找数组同样元素的更多相关文章

  1. Leetcode724:寻找数组的中心索引(java、python3)

    寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相 ...

  2. Java实现 蓝桥杯 算法训练 寻找数组中最大值

    算法训练 寻找数组中最大值 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 对于给定整数数组a[],寻找其中最大值,并返回下标. 输入格式 整数数组a[],数组元素个数小于1等于10 ...

  3. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

  4. java数组集合元素的查找

    java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...

  5. java去除数组重复元素的方法

    转载自:https://blog.csdn.net/Solar24/article/details/78672500 import java.util.ArrayList; import java.u ...

  6. 【算法31】寻找数组的主元素(Majority Element)

    题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完<算法导论>后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以 ...

  7. Java比较两个数组中的元素是否相同的最简单方法

    import java.util.Arrays; public class Test { /** * Java比较两个数组中的元素是否相同 */ public static void main(Str ...

  8. Java实现 LeetCode 724 寻找数组的中心索引(暴力)

    724. 寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧 ...

  9. Java实现找出数组中重复次数最多的元素以及个数

    /**数组中元素重复最多的数 * @param array * @author shaobn * @param array */ public static void getMethod_4(int[ ...

随机推荐

  1. JS - 循环添加 DropDownList(Select)

    代码: <td style="padding-left: 10px;"> <select id="ddl_picture_3"> < ...

  2. JSP自定义标签——传统标签

    同JSP标签一样,自定义标签主要用于移除JSP页面中的Java代码,可以看到我们在JSP中其实是禁止使用Java脚本的,任何要想通过Java代码实现的功能都必须以标签形式来处理,可以使用JSP标签,J ...

  3. Uva - 11383 - Golden Tiger Claw

    题意:一个N*N的矩阵,第i行第j列的元素大小为w[i][j],每行求一个数row[i],每列求一个数col[j],使得row[i] + col[j] >= w[i][j],且所有的row[]与 ...

  4. js获取当前日期,网页头部用

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. 怎样从ext3升级到ext4?

    Ext4 文件系统提供了更佳的性能和可靠性,具有了更为丰富的功能,那么,怎样从ext3升级到ext4呢? 首先,我们须要保证系统支持ext4,一般来说,内核版本号在2.6.28及以上的版本号才支持ex ...

  6. android面试题 不仅仅是面试是一个很好的学习

    下面的问题是在网上找到的总结,感谢您分享!希望,我们的共同进步,找到自己心仪的公司,: 1.android dvm 流程和Linux这个过程.无论是应用程序对同一概念: 答案:dvm是dalivk虚拟 ...

  7. MySQL 通配符学习总结

    MySQL 通配符 SQL您同意使用模式匹配"_"无论单个字符相匹配,和"%"匹配随意数目字符(包含零个字符). 在 MySQL中.SQL的模式缺省是忽略大写和 ...

  8. Delphi xe7并行编程快速入门(三篇)

    现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...

  9. delphi cmd(4个例子都是通过管道取得)

    //K8执行DOS并返回结果 function RunDosCommand(Command: string): string; var hReadPipe: THandle; hWritePipe:  ...

  10. 奋斗的孩子的TableView(三篇文章)

    http://blog.sina.com.cn/s/blog_a6fb6cc90101i8it.html http://blog.sina.com.cn/s/blog_a6fb6cc90101hhse ...