笔者由于在找工作,所以近期最主要的任务就是准备面试,不打无准备之仗。只有你准备充分了,那么你想要的机会才有机会入你怀中。

笔者会将准备面试的学习过程记录下来,方便自己复盘的同时也希望能给一道找工作的小伙伴们一些帮助。笔者准备的内容大纲如下

Android面试大纲.png

妥妥的去面试之数据结构与算法(一)

下面是本篇博客的正菜部分:

一、找出数组中重复的数字

在一个长度为n的数组里的所有数字都在0~n-1的范围内。找出数组中任意一个重复的数字。

注意:如果题目改成找出数组中重复的数字的话,就需要和面试官沟通,我是找出所有重复的数字还是只需要找出一个就好了。

排序法

先把原数组进行一次排序,再对排序好的数组从头到尾进行遍历,很容易找到重复的数字,排序长度为n的数组需要O(nlogn)的时间。

哈希表法

可以借助哈希表解决该问题,从头到尾扫描该数组,判断该扫描到的数是否存在于该哈希表中,如果不存在则放于该哈希表中,如果存在则为重复元素。这个算法的时间复杂度是O(n),但却是以大小为O(n)的空间复杂度为代价。

交换法

如果没有重复元素的话,那么重排该数组后,数字i会出现在下标i的位置。如果有重复元素的话,下标i的位置可能不止一个数字,也可能没有数字。

从头到尾扫描数组,扫描到下标为i的数字(用m表示)看是否等于i,如果是则接着扫描下一个数字,如果不是,再拿它和下标为m的那个数字比较,如果相等,则找到一个重复数字,如果不相等,就和它交换。重复这样的操作,直到找到重复的数字。

代码实例:

如果不存在重复元素的话,返回-1(具体返回的值可以和面试官沟通)

public int getDuplicateNumber(int[] numbers){int len = numbers.length;if(numbers == null || len <= 0) return -1;for(int i=0;i<len;i++){if(numbers[i] < 0 || numbers[i] > len-1)return -1;}for(int i=0;i<len;i++){while(numbers[i] != i){if(numbers[i] == numbers[numbers[i]]){return numbers[i];  //找到重复元素}else {//交换numbers[i]和numbers[numbers[i]]的值int temp = numbers[i];numbers[i] = numbers[temp];numbers[temp] = temp;}}}return -1;}

二、不能修改数组找出重复的数字

在一个长度为n+1的数组里的所有数字都在1~n的范围内。找出数组中任意一个重复的数字。不能改变原数组并且不可借助大小超过O(n)的辅助空间。

二分法

因为长度是n+1,所以该数组至少有一个重复的数字。可以根据长度进行一半一半的分割。比如长度为8的数组,把它分两半:1-4,5-7。先在数组中找在1-4范围内的数的个数,如果超过4个说明重复的数字在1-4中。这样就缩小了范围,之后继续二分,在数组中分别找1-2,3-4这两组数字的个数,直到找到一个重复的数字。

public int getDuplicateNumber2(int[] numbers){int len = numbers.length;if(numbers == null || len <= 0) return -1;int start = 1;int end = len-1;while(end >= start){int middle = ((end - start) >> 1)+start;int count = countRange(numbers,len,start,middle);if(end == start){if(count > 1) return start;  //找到重复元素else break;}if(count >(middle-start+1))end = middle;elsestart = middle+1;}return -1;}private int countRange(int[] numbers, int len, int start, int end) {if(numbers == null)return 0;int count = 0;for(int i=0;i<len;i++){if(numbers[i]>=start && numbers[i]<=end)++count;}return count;}

参考:剑指offer P39

面试系列的文章都放于 面试妥妥的 建议小伙伴们关注该专题

妥妥的去面试之数据结构与算法(一)相关推荐

  1. 保研/面试复习-数据结构与算法-万字总结(近三万字)

    以下是笔者整理的保研/面试容易被问到的算法问题,包含最短路径,dfs,bfs,最小生成树MST(krusal和prim),KMP(这个可能较难,如果算法不是问得很深,一般不会问到),十种排序算法(大部 ...

  2. 年后跳槽BAT必看:10种数据结构、算法和编程课助你面试通关

    作者 | javinpaul 译者 | 大鱼 编辑 | 一一 出品 | AI 科技大本营 进入 BAT 这样的巨头企业工作,无疑是很多程序员的梦想.但事实上,能通过这些公司高难度编程面试的只是一小撮人 ...

  3. JS数据结构与算法_链表

    上一篇:JS数据结构与算法_栈&队列 下一篇:JS数据结构与算法_集合&字典 写在前面 说明:JS数据结构与算法 系列文章的代码和示例均可在此找到 上一篇博客发布以后,仅几天的时间竟然 ...

  4. 数据结构与算法真的那么重要么?

    很多同学对数据结构与算法的第一印象,可能是觉得它复杂.深奥.难以理解.之所以会有这种观念,我认为主要是因为没有找到适合自己的学习方法及学习资料.其实学习任何知识点,只要找到对的学习方法和学习资料,都能 ...

  5. 数据结构与算法(无排版有兴趣的小伙伴可私我要原版)

    数据结构与算法 课程介绍 数据结构和算法,一个非常古老的课题. 上学的时候就觉得数据结构和算法很难学,似乎就从来没学明白过. 工作的时候,只求程序能跑,并不太关注性能,所以尽量避坑(ArrayList ...

  6. 02如何抓住重点,系统高效地学习数据结构与算法?

    以下内容总结自极客时间王争大佬的<数据结构与算法之美>课程,本文章仅供个人学习总结. 什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构.算法就是操作数据的一组方法 ...

  7. 妥妥的去面试之Android基础(六)

    笔者由于在近期需要找工作,所以近期最主要的任务就是准备面试,不打无准备之仗.只有你准备充分了,那么你想得到的机会才可能有机会入你怀中. 笔者会将准备面试的学习过程记录下来,方便自己复盘的同时也希望能给 ...

  8. 妥妥的去面试之Android基础(五)

    笔者由于在近期需要找工作,所以近期最主要的任务就是准备面试,不打无准备之仗.只有你准备充分了,那么你想得到的机会才可能有机会入你怀中. 笔者会将准备面试的学习过程记录下来,方便自己复盘的同时也希望能给 ...

  9. 妥妥的去面试之Android基础(四)

    笔者由于在近期需要找工作,所以近期最主要的任务就是准备面试,不打无准备之仗.只有你准备充分了,那么你想得到的机会才可能有机会入你怀中. 笔者会将准备面试的学习过程记录下来,方便自己复盘的同时也希望能给 ...

最新文章

  1. CentOS6.8 Redis5 开机自动启动命令设置
  2. Oracle DB 服务器 系统时间修改问题 与 SCN 关系的深入研究
  3. 游戏服务器的架构演进
  4. 通过一个最简单的例子,理解Angular rxjs里的Observable对象的pipe方法
  5. MySQL Show命令的使用
  6. 【Kafka】Kafka 1.1.0以后版本获取Kafka每个分区最新Offset的几种方法
  7. python3语音控制电脑_python语音控制电脑_uusee全屏
  8. MVC之 自定义过滤器(ActionFilterAttribute)
  9. 最近在忙着做一个加密的项目,还自己找的私活.
  10. win10激活方法 电脑病毒和防威胁按键是灰色的,密钥无效的,无法激活的时候怎么强制激活电脑系统
  11. adb shell top 命令详解
  12. uniapp实现退出登录
  13. u8转完看不到菜单_用友U8软件菜单和导航有功能不能正常显示,如何解决?
  14. BUUCTF:[GKCTF2020]Harley Quinn
  15. 快递电子面单批量打印接口对接demo-JAVA
  16. Android 微信双开
  17. MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification
  18. C语言小项目-火车票订票系统
  19. python字符串str_python3 字符串str 教程
  20. CSS 渐变色 (超好看)

热门文章

  1. Git使用教程:完全图解!
  2. 衣服上的RFID标签对身体有什么影响
  3. 学阿里中台,80%的人只学到了皮毛!揭秘阿里中台的12个架构思维和原则
  4. Hadoop Applier
  5. JavaWeb-06 (项目案例3)
  6. Linux kill,killall和killall5
  7. cad老是弹出命令中发生异常_CAD出现致命错误的解决方法
  8. wince挂起和唤醒(suspend/wakeup)
  9. Excel函数--SUM计算累计销量
  10. validator-tools