`
ai_zxc
  • 浏览: 12417 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

计算两个数组相邻的成对出现个个数(咋个办呢 zgbn)

阅读更多

题目如下

有a1和a2都是为无符号数组,al1和al2为数组的长度,数组的长度为偶数。无符号数组有一对数字区间组成。

例如:a1={0,1,3,6,10,20,4,5};

          a2={0,1,20,30,50,4,5};

 其中:a1表示为下区间[0,1],[3,6],[10,20],[4,5];

           a2标示为下区间[0,1],[20,30],[35,0],[4,5];

则:计算a1和a2重叠的下区间个数。例如:a1和a2重叠下区间为[0,1][4,5]个数为2。

下面实现算法,计算1000000数组下区间重叠出现个数用时为90ms左右。

package com.demo;

import java.util.Random;

/**
 * 有a1和a2都是为无符号数组,al1和al2为数组的长度,数组的长度为偶数。
 * 无符号数组有一对数字区间组成,例如:
 * a1={0,1,3,6,10,20,4,5}
 * a2={0,1,20,30,50,4,5}
 * 则:
 *  a1表示为下区间[0,1],[3,6],[10,20],[4,5]
 *  a2标示为下区间[0,1],[20,30],[35,0],[4,5]
 * 计算a1和a2重叠的下区间个数。例如:a1和a2重叠下区间为[0,1][4,5]个数为2.

 * 下面实现算法,计算1000000数组下区间重叠出现个数用时为90ms左右。
 * 
 * @author ChenGang
 */
public class Demo01 {

 /**
  * @param args
  */
 public static void main(String[] args) {

  long time1 = System.currentTimeMillis() ;

  int num = 1000000 , len = 1000000 ;

  //声明数组 
  int[] num1 = randomArray(num,len) ;
  num1 = new int[]{0,1,3,6,10,20} ;
  System.out.println(String.format("生成数组num1用时:%dms",System.currentTimeMillis()-time1));

  int[] num2 = randomArray(num,len) ;
  num2 = new int[]{0,1,20,50,4,5} ;
  System.out.println(String.format("生成数组num2用时:%dms",System.currentTimeMillis()-time1));

  quickSort(num1);
  System.out.println(String.format("对数组num1排序用时:%dms",System.currentTimeMillis()-time1));

  quickSort(num2);
  System.out.println(String.format("对数组num2排序用时:%dms",System.currentTimeMillis()-time1));


  System.out.println(String.format("计算num1和num2重复出现成对数字个数 %d 。", excLogic(num1,num2)));
  System.out.println(String.format("计算num1和num2重复出现成对数字个数用时:%dms",System.currentTimeMillis()-time1));

 }

 /**
  * 计算下区间个数逻辑处理
  * @param _arr1
  * @param _arr2
  * @return
  */
 private static int excLogic(int[] _arr1 , int[] _arr2){

  int num = 0 ,  count=0 , idx1=0 , idx2=0 ;

  int[] arr1 = null , arr2 = null ;

  if(_arr1.length >= _arr2.length){
   arr1 = _arr1 ;
   arr2 = _arr2 ;
  }
  else{
   arr1 = _arr2 ;
   arr2 = _arr1 ;
  }

  while(idx1 < arr1.length){

   if(idx2>=arr2.length){
    break ;
   }

   if(arr1[idx1]==arr2[idx2]){
    count++ ;
    idx1++ ;
    idx2++ ;
   }
   else{
    if(count<2){
     idx1=idx1<=0?0:idx1-1 ;
     idx2=idx2+1 ;
    }
    else{
     if(idx1%2==0){
      idx2=idx2+2;
     }
     else{
      idx1=idx1<=0?0:idx1-1 ;
      idx2=idx2+1 ;
     }
     num = num+count/2 ;
    }
    count=0 ;
   }
  }

  if(count>0){
   num = count/2 ;
  }

  return num ;
 }

 /**
  * 构造随机数数组
  * @param num
  * @return
  */
 private static int[] randomArray(int num , int len){
  java.util.Random random = new Random() ;
  int[] arr = new int[len] ;
  for (int i = 0; i < arr.length; i++) {
   arr[i] = random.nextInt(num) ;
  }
  return arr ;
 }


 public static void quickSort(int[] a) {
  _quickSort(a,0,a.length-2) ;
 }

 /**
  * 对数组进行特殊化排序
  * @param arr
  * @return
  */
 private static void _quickSort(int[] a, int lo0, int hi0) { 

  int i = lo0 , j = hi0; 

  if (i >= j) 
   return; 
  //确定指针方向的逻辑变量 
  boolean flag=true; 

  while (i != j) { 
   if (a[i] > a[j] || (a[i]==a[j] && a[i+1]>a[j+1])) { 
    //交换数字 
    int temp1 = a[i];
    int temp2 = a[i+1];

    a[i] = a[j];
    a[i+1] = a[j+1];

    a[j] = temp1; 
    a[j+1] = temp2;

    flag = (flag == true) ? false : true; 
   } 
   //将指针向前或者向后移动 
   if(flag) 
    j=j-2; 
   else 
    i=i+2; 
  } 

  //将数组分开两半,确定每个数字的正确位置 
  i=i-2; 
  j=j+2; 
  _quickSort(a, lo0, i); 
  _quickSort(a, j, hi0); 

 } 

}

 

1
1
分享到:
评论
1 楼 QuarterLifeForJava 2015-10-30  
其实我觉得你这道题,归到最后基本可以理解为两数组求并集

相关推荐

    javaee电子商城系统课程设计样本.doc

    javaee电子商城系统课程设计样本.doc

    scratch少儿编程逻辑思维游戏源码-糖果大爆险.zip

    scratch少儿编程逻辑思维游戏源码-糖果大爆险.zip

    spring-boot-2.7.2.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-1.3.6.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    GIS安装施工综合方案.doc

    GIS安装施工综合方案.doc

    基于PHP+CSS+JS+MySQL的选题系统源码——B/S架构下多角色登录与权限管理

    内容概要:本文详细介绍了选题系统源码,涵盖PHP、CSS、JavaScript和MySQL四种核心技术。系统采用B/S架构,支持管理员、审核员、教师和学生四种身份登录,每种身份有独立的功能权限。文中提供了详细的环境搭建指南,如使用phpStudy和Navicat进行项目管理和数据库操作。此外,还展示了关键代码片段,如登录验证、权限管理、数据库设计以及界面优化方法。同时,针对性能优化提出了建议,如解决N+1查询问题的方法。 适合人群:适用于有一定编程基础,尤其是对PHP和Web开发感兴趣的开发者和技术爱好者。 使用场景及目标:① 学习并掌握B/S架构的应用开发流程;② 实践多角色登录和权限管理的具体实现;③ 提升Web应用的界面优化和用户体验;④ 掌握数据库设计和性能优化技巧。 其他说明:本文不仅提供了完整的代码示例,还包括了详细的开发文档和支持材料,帮助读者快速上手并深入理解整个项目的构建过程。

    scratch少儿编程逻辑思维游戏源码-下水道冒险猫.zip

    scratch少儿编程逻辑思维游戏源码-下水道冒险猫.zip

    scratch少儿编程逻辑思维游戏源码-下雨时向北的路.zip

    scratch少儿编程逻辑思维游戏源码-下雨时向北的路.zip

    三相下垂双逆变器同步并联控制技术的研究与应用

    内容概要:本文深入探讨了三相下垂双逆变器同步并联控制技术,重点介绍了下垂控制的基本原理及其在微电网中的应用。文章详细解释了下垂控制如何通过调整频率和电压幅值来实现负载的自动分配,并讨论了在多台逆变器并联时可能出现的环流问题以及解决方案,如虚拟阻抗法。此外,还介绍了同步环节的关键技术,特别是改进型锁相环的应用,并提供了具体的实现代码示例。最后,文章分享了一些实用的调试技巧和经验,强调了参数整定的重要性。 适用人群:从事电力电子、微电网控制领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解三相下垂双逆变器同步并联控制技术的工程师和科研人员,旨在帮助他们掌握核心技术,解决实际工程中的问题。 其他说明:文中提供的代码示例和调试方法有助于读者更好地理解和应用相关技术,提高系统的稳定性和性能。

    spring-data-redis-1.2.1.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    GEPLC机组自动化装置编程使用说明书.doc

    GEPLC机组自动化装置编程使用说明书.doc

    scratch少儿编程逻辑思维游戏源码-我的领土.zip

    scratch少儿编程逻辑思维游戏源码-我的领土.zip

    spring-boot-1.3.3.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    scratch少儿编程逻辑思维游戏源码-我的世界 MMO V1.6.zip

    scratch少儿编程逻辑思维游戏源码-我的世界 MMO V1.6.zip

    scratch少儿编程逻辑思维游戏源码-坦克(1).zip

    scratch少儿编程逻辑思维游戏源码-坦克(1).zip

    GSM移动通信网容量解决方案.doc

    GSM移动通信网容量解决方案.doc

    scratch少儿编程逻辑思维游戏源码-天台狂飙.zip

    scratch少儿编程逻辑思维游戏源码-天台狂飙.zip

    scratch少儿编程逻辑思维游戏源码-逃避猫 避险闯关游戏.zip

    scratch少儿编程逻辑思维游戏源码-逃避猫 避险闯关游戏.zip

    spring-boot-1.2.6.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-data-redis-1.3.1.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

Global site tag (gtag.js) - Google Analytics