按照一般思路,遍历整个数列,就可以找到那个单个的数,但此时的算法复杂度为O(n);
因此,我们可以采用一种更加方便的思路,使用分治算法求解
1.数列的长度一定为奇数,因此找数列的中位数,用该数分别和他前面一个数和后面一个数比较,若都不相同,则该数为所要找的单数
2.若等于前面一个数,那么求该数左边和右边的剩余数列的长度,单数一定在长度为奇数的那半边,递归寻找
3.若等于后面一个数,同样思路求解;
class QiuDanShu{
 public QiuDanShu(){
  
 }
 public void qiujie(int a[] , int b, int c){
  int mid = (b + c)/2;
  if(c-b == 0) {
   System.out.println("位置在:" + b);
   System.out.println("单数为:" + a[c]);
   return;
   
  }
  if(a[mid] != a[mid+1] && a[mid] != a[mid -1] ) {
   System.out.println("位置在:" + mid);
   System.out.println("单数为:" + a[mid]);
   return;
  }
  else if(a[mid] == a[mid -1]){
   if((c - mid - 1)%2 == 0 ) {
    qiujie(a , mid+1, c);
   }
   else {
    qiujie(a , b, mid-2);
   }
  }
  else
   {
   if((mid-1-b)%2 == 0 ) {
    qiujie(a , b, mid-1);
   }
   else {
    qiujie(a ,  mid +2 , c);
   }
    }
  }
 }
public class TestDan {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  int a1[] = new int []{9,9,0};
  int c = a1 .length;
  QiuDanShu test1 = new QiuDanShu();
  test1.qiujie(a1, 0, c-1);
}
}

有一个排好序的数列,数列中只有一个数只出现1次,其余每个数均出现了两次,设计出一个算法,找出那个只出现了一次的数相关推荐

  1. 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数...

    现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数. 方法1:Hash链表 方法2:使用两个变量A和B,其中A存储某个数组中的数,B用来计数.开始时将B初始化为0 ...

  2. /*已知一个排好序的数组,按数组原排序方式插入一个数据*/

    /*已知一个排好序的数组,按数组原排序方式插入一个数据*/std::vector<int>shuzu = {1,2,3,4,5,7,8,9};int x = 0, caru = 6;std ...

  3. C语言-数组和指针-11(已有一个排号序的数组,要求输入一个数后,按原来的排序规律将它插入数组中)

    题目: 已有一个排号序的数组,要求输入一个数后,按原来的排序规律将它插入数组中 源代码: #include <stdio.h> #define ROW 7 int main(){int a ...

  4. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组(GO,PHP)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  5. 在已经排好序的线性表中插入一个数,还是升序

    在已经排好序的线性表中插入一个数,还是升序 #include<stdio.h> #define Maxsize 100 typedef struct s {int elem[Maxsize ...

  6. Java黑皮书课后题第6章:**6.28(梅森素数)如果一个素数可以写成2^p-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数。编写程序,找出p≤31的所有梅森素数,然后显示如下结果

    6.28(梅森素数)如果一个素数可以写成2^p-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数.编写程序,找出p≤31的所有梅森素数,然后显示如下结果 题目 题目描述 破题 代码 题目 题目 ...

  7. 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    package demo;import java.util.Arrays;/** 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.*/ //num ...

  8. 【排序】 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。(java)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  9. 为什么处理一个排好序的数组比未排序的数组要快?

    这是stack overflow上一个非常火热的问题: 为什么对数组排序能提高执行效率?先看下面的代码,执行分为: 生成随机数放入数组 对数组进行排序 对数组中的数字进行累加 publicclassM ...

  10. 打乱一个排好序的列表(Python)

    目录 题目描述 输出描述 代码 代码走读 传送门 测试用例 题目描述 随机生成一个长度10的整型列表,元素随机分布在1--100内.按从小到大的顺序排序列表并打印,然后输出顺序打乱后的列表. 输出描述 ...

最新文章

  1. 面试官问我什么是扩展自适应机制
  2. 后台ajax调用中字符串到jquery中的json对象和数组对象转换问题
  3. Linux下使用service启动jar包.md
  4. JavaWeb——多个Filter代码的执行顺序
  5. 【CV】目标检测的常用数据处理方法!
  6. c++ udp多线程 例子_[内附完整源码和文档] 基于udp实现tcp功能进行大文件传输
  7. ARM汇编指令格式及规则
  8. import java.io6_JavaIO(六) 转换流
  9. 【IT】jQuery AJAX Call to MVC Controller with Parameters
  10. python如何定义类_Python class定义类,Python类的定义(入门必读)
  11. php记录上次观看记录,PHP Cookei记录用户历史浏览信息的代码
  12. Graph Theory 离散数学第五章
  13. 【嵌入式Linux应用开发】移植LVGL到Linux开发板
  14. 回顾:HTTP/HTTPS/对称加密/非对称加密/session/cookie/token
  15. SQlException 对象名无效
  16. Shell内建命令之echo、local、logout
  17. CUDA中的NVCC编译器详解
  18. MySQL 数据库备份和还原数据库 mysqldump、source
  19. Python——星期的字典1——7
  20. Powerbi 通过On-premises data gateway 连接本地多维数据库

热门文章

  1. 统信UOS arm平台用户,是时候告别网页版微信​了!
  2. 计算机存储密码的方式,关于数据加密存储的四种途径【图解】
  3. 2022年深圳市疫情补贴政策及怎么申请,补贴5000万
  4. 阿里云APP软件著作权在线登记步骤?
  5. V4L2文档翻译(十二)
  6. oracle 用户无限期,oracle永久密码和登录次数无限制设置
  7. 鸿蒙系统走进大学课堂,华为鸿蒙系统HarmonyOS课程走进高校,武汉大学等高校将授课...
  8. 桂林阳朔游10月7日(续上)
  9. 【5G核心网】 Handover procedures Execution phase切换流程执行阶段
  10. 图的创建(邻接矩阵和邻接表)