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

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

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

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. ABAP 向上取整和向下取整 CEIL & FLOOR

    下面是一段关于CEIL 和 FLOOR 的代码 DATA:a TYPE mseg-menge, b TYPE mseg-menge, c TYPE mseg-menge. a = '1.36'. b ...

  2. Servlet的学习之Response响应对象(3)

    本篇来说明响应对象HttpServletResponse对象的最后一点内容. 首先来看响应对象控制浏览器定时刷新,在我的web应用[myservlet]中创建Servlet,在该Servlet中设置响 ...

  3. Perl入门(四)Perl的正則表達式

    正則表達式是Perl语言的特色.主要的语法不是非常难,可是编写一个符合需求.高效的正則表達式.还是有一些挑战的. Perl的三种匹配模式 1.查找 语法:m/正則表達式内容/; 作用:查找匹配内容中是 ...

  4. 分分钟教会你使用HTML写Web页面

    在学习怎样使用HTML编写网页之前,我们必须先搞清楚什么是HTML?当然了不是系统的给大家介绍HTML的前世今生,假设对其身世感兴趣的小伙伴能够去问度娘,她会给你想要的答案. 所谓HTML,就是我们常 ...

  5. [置顶] 自己动手写Web容器之TomJetty之六:动态页面引入

    传送门 ☞ 1.Web服务内功经脉 传送门 ☞ 2.让服务动起来 传送门 ☞ 3.掀起请求盖头来 传送门 ☞ 4.静态页面起步 传送门 ☞ 5.包装请求参数 在上一节,我们已经完成了TomJetty服 ...

  6. javascript (二) 事件

    <script></script> 函数写法: function  fun_name(){ x=docment.getElementById("demo") ...

  7. Servlet和JSP读书笔记(一)

    Java Servlet 技术,简称Servlet,是Java中用于开发web应用程序的基本技术. Servlet实际上也就是一个Java程序.一个Servlet应用程序通常包含很多Servlet.而 ...

  8. STM32学习笔记2-系统时钟知识及程序配置

    一:基本知识 1.  STM32F103ZE有5个时钟源:HSI.HSE.LSI.LSE.PLL.   ①.HSI是快速内部时钟,RC振荡器,频率为8MHz,精度不高.   ②.HSE是快速外部时钟, ...

  9. POJ 1742 hdu 2844 Coins

    题目链接:http://poj.org/problem?id=1742 http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目分类:动态规划 代码: #in ...

  10. poj1269(直线交点)

    传送门:Intersecting Lines 题意:给出N组直线,每组2条直线,求出直线是否相交.如果共线则输出LINE,相交则输入点坐标,否则输出NONE. 分析:模板裸题,直接上模板... #in ...