题目:

一个整形数组里除了一个数字出现3次以外,其他数字都出现2次.请写程序找出这个出现3次的数字.

要求使用辅助空间O1,时间复杂度Onlogn.

1.使用堆排序.(堆排序的时间复杂度为Onlogn)

因为堆排序每次取到的都是最大(或是最小)的数字,三个相同的数字肯定是紧挨着被取出的.

所以在原先的堆排序算法上,加2个标记记录即可.

代码:

// 使用堆排序,每次取最大的,连续取到3个相同的,那说明就是

public static int find2(int[] array) {

// 堆排序的:形成堆结构,

// 从最后一个有叶子节点的节点开始,

// 也就是最后一个节点的父节点

for (int i = (array.length >> 1) - 1; i >= 0; i--) {

refactor(array, i, array.length);

}

// 2个分别用来记录前以及前前

Integer pre = null;

Integer prePre = null;

for (int i = 1; i <= array.length; i++) {

// 如果相同,返回

if (pre != null && pre == prePre && array[0] == pre) {

return array[0];

}

if (pre == null) {

pre = array[0];

swap(array, 0, array.length - i);

refactor(array, 0, array.length - i);

continue;

}

prePre = pre;

pre = array[0];

swap(array, 0, array.length - i);

refactor(array, 0, array.length - i);

}

// 如果没找到,说明输入数组有问题,抛异常

throw new RuntimeException();

}

static void refactor(int[] array, int root, int length) {

int left = (root << 1) + 1;

int right = (root + 1) << 1;

if (left == length - 1 && array[left] > array[root]) {

swap(array, root, left);

return;

}

if (right < length) {

if (array[left] >= array[right] && array[left] > array[root]) {

swap(array, root, left);

refactor(array, left, length);

return;

}

if (array[right] > array[left] && array[right] > array[root]) {

swap(array, root, right);

refactor(array, right, length);

return;

}

}

}

private static void swap(int[] array, int a, int b) {

int tmp = array[a];

array[a] = array[b];

array[b] = tmp;

}

2.这里有个非常简单的方法:

那就是异或:

一个数异或他本身得到0,那么把所有的数异或得到的最后的结果肯定就是出现3次的那个数了.

public static int find1(int[] array) {

int target = array[0];

// 遍历,异或所有

for (int i = 1; i < array.length; i++) {

target ^= array[i];

}

// 最后的值就是本身

return target;

}

升级版:

剑指offer面试题40-数组中只出现一次的数字

阿里巴巴Java笔试题很难_2016阿里巴巴java笔试题相关推荐

  1. 阿里巴巴Java笔试题很难_阿里巴巴Java笔试题和面试题答案

    阿里巴巴集团经营多元化的互联网业务,致力为全球所有人创造便捷的交易渠道.自成立以来,阿里巴巴集团建立了领先的消费者电子商务.网上支付.B2B网上交易市场及云计算业务,近几年更积极开拓无线应用.手机操作 ...

  2. (1) Dot net“很难”实现像Java一样的跨平台性

    大犬 .net"很难"实现像Java一样的跨平台性 已发布: 2004-12-11 下午8:05   回复 前两天在网上看了一个帖子,大概意思是: Java在今后很长的一段时间将是 ...

  3. java开发感觉很难_为什么很难找到优秀的Java开发人员?

    java开发感觉很难 就像大量无聊的程序员中的针刺一样,优秀的Java开发人员供不应求. 但是谁该怪? 无私的程序员? 招聘人员误入歧途? 还是语言本身? 不管您是否同意,以下是一些为什么最难找到像样 ...

  4. 进Java大厂面试很难吗?借鉴京东大咖这套架构,面试后我能拿8w

    最近有不少小伙伴在后台留言,说 Java 的面试越来越难了,尤其是技术面,考察得越来越细,越来越底层.疫情期间虽说某些大厂高薪放低标准进行招聘,但很多小伙伴还是含泪转身.因为目前新老程序员更替严重,跳 ...

  5. 学计算机难吗d,我想学计算机,五笔打字很难吗

    满意答案 揮劍斬蒼天 2014.01.04 采纳率:50%    等级:12 已帮助:9087人 五笔不难的,只需记住下面3点: 1:知道五笔是什么:一丨丿丶乙 (横竖撇捺折) 2:知道这五个笔划在键 ...

  6. 上位机软件用什么写的_为什么这么多Java开发者会觉得用Java写网站很难?

    用Java写个网站?这对于不少初学者来说,感觉难于上青天,许多的工作要做,许多知识没掌握......感觉所有东西都无从下手,是不是? 但是小编告诉你,其实写一个网站并不难,为什么这么说呢? 1.难与不 ...

  7. java浮点运算很难_关于Java:浮点运算不能产生精确结果

    本问题已经有最佳答案,请猛点这里访问. 我需要在Java中做一些浮点运算,如下面的代码所示: public class TestMain { private static Map ccc = new ...

  8. java linux res很高_Linux下Java进程RES是1.6G,但是jmap里用到的才五百多M,剩下的1.1G左右是去哪了?...

    具体信息如下: RES是1.6G PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28527 root 20 0 12.1g 1.6g 13 ...

  9. 挑战10个最难回答的Java面试题,我第2题就跪了...

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 这是 ...

最新文章

  1. HTML引用公共组件
  2. 语义分割--Pixel Deconvolutional Networks
  3. 使用rsync实现数据实时同步备份--实战
  4. 电脑介绍,最好手提电脑介绍
  5. java写万年历_用java代码写万年历
  6. webform 转 MVC 飞一般的感觉
  7. pb 哪里找到系统图标_win10电脑桌面上“回收站”和“此电脑”图标不见了怎么办...
  8. 数字图像处理与Python实现笔记之图像特征提取
  9. java程序math包没有_java.math包应用
  10. PHP实现多线程抓取网页
  11. 堡垒之夜服务器维修,堡垒之夜常见问题解决方法
  12. Windows Server Version 1709 管理之入门篇
  13. linux野指针追踪,【华清远见】野指针和空指针的两个小点
  14. Linux驱动:VFIO概述(vfio/iommu/device passthrough)
  15. hive 不同用户 权限设置 出错处理
  16. B样条曲线(B-spline Curves)
  17. 二分类确定画出roc曲线,以及基于roc曲线获得最佳划分阈值
  18. 基于Androidstudio餐厅点餐选座系统
  19. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学排名第31(2018年TFE美国排名)...
  20. Error: Corrupted zip: missing XXX bytes.

热门文章

  1. mysql手动对表或记录进行上锁处理
  2. 数据结构(一)——线性链表的原理以及应用
  3. 天天生鲜项目——提交订单页
  4. 用js在页面中创建svg标签不显示的问题
  5. 数据链路层的广播信道
  6. Android SoundTouch(处理音频)
  7. python列表数字比大小教案_幼儿园大班数学教案:数字比大小
  8. c语言字符串强制类型转换,C语言学习九 —头文件强制类型转换错误处理
  9. 01. 计算机专业关于单位的解释和换算
  10. kinect 2.0 标定 matlab