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

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

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

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. Tomcat详细用法学习(二)

    本篇接上一篇<Tomcat详细用法学习(一)>,主要讲解服务器的虚拟目录映射的几种方式. 先来看几个概念: web应用的概念:一个web应用包含了许多我们做好的web资源,里面或许包括了多 ...

  2. Mac 终端提示You have not agreed to the Xcode license agreements

    在mac 终端运行命令的时候会被提示没有同意xcode 证书 ,这个时候需要在Terminal中同意license 打开终端输入xcodebuild -license,会看到一大堆的license说明 ...

  3. Xamainr 地图之webview初探

    一 说几点 当下移动开发主要实现方式有传统的Native以及新的混合开发想Rect.js,nodejs这些前段框架,其本质要么是原生控件来实现UI,要么html来实现UI.Xamarin其实也只是取巧 ...

  4. 如果用float实现居中

    今天发现自己做的一个项目中有个图片切换的下面的按钮不是固定个数,程序那边根据循环实现放几个切换的按钮,但是按钮相对于整体的要居中,刚开始想着用display:inline-block;实现,但是ie6 ...

  5. memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间

    memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间 memcached vs MySQL Memory engin ...

  6. 在cocos2d-x jsb/html5中设置触摸代理的方法

    和官方的说明不同,js binding的很多api和ch5版是不一样的.遇到不一样的就需要我们努力去看源码寻找了. 主要是以下几个文件 cocos2d_specifics.cpp cocos2d_sp ...

  7. -force_load

    Crash Log: Last Exception Backtrace: 0   CoreFoundation                 0x2f087f06 __exceptionPrepro ...

  8. XMPP入门

    本人原创,很多其它xmpp知识.ios知识.其它分享知识见:我的个人博客 简单介绍: 1.XMPP是可扩展消息与存在协议,主要用于im. 2.他是一种类似于http协议的传输数据协议.过程如:&quo ...

  9. c#超时锁定

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. 禁用掉用户帐号,用户Lync客户端仍然可以登录!

    问题: 有这样的一个情况,一位具有LYNC权限的用户离职了,AD账号已经禁用.LYNC和邮箱功能暂时保留.可用户离职4天了,还能够正常登录到LYNC,能够正常发送和接收即时消息.我经过测试,确实AD账 ...