23<剑指>以前提交未通过的5道题

19.数组中只出现一次的数字

题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。

思路:

暴力解法:将数组排序,如果这个数和它前后两个数都不等,就是要找的数,注意第一个和最后一个

暴力解法:用ArrayList存遍历数组的值,若当前遍历的值,在ArrayList中都有了,在ArrayList中删除该值,最后ArrayList中的两个数就是只出现一次的数字

20.统计一个数字在排序数组中出现的次数

题目描述:统计一个数字在排序数组中出现的次数

暴力解法:从头遍历数组,比较数字出现的次数

因为数组有序,从找到第一个数字开始,直到这个数字结束的比较次数才是有意思的,所以先用二分查找法找到数字第一次出现位置和最后一次出现的位置,最后做差

感悟:总想暴力解决算法

21.两个链表的第一个公共结点

题目描述:输入两个链表,找出它们的第一个公共结点

思路:比较两个链表的长度,让长链表移动到两链表长度差个元素的位置,然后在一起移动指针,相遇的第一个节点就是返回结果

感悟:思路清晰,实现不难,就是要细心,之前把计算第二个链表长度的语句写成

while(temp2!=null){

            len2++;

            temp2=temp1.next;

        }

测试不通过,找了好久。。。

22.和为S的连续正数序列

题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

思路:设置两个指针,一个指向当前序列的最小的数,一个指向当前序列最大的数。

1)设置两个指针,一个为small指向当前正数序列中最小的数,一个为big指向当前正数序列中最大的数;因为至少包括两个数,所以small一定比和S的一半要小,查找的边界就是small<(1+s)/2

2)若是当前的正数序列之和大于S,缩小序列范围,和中减掉small,让small指针不停向后走,直到等于S停止;

3)若是当前的正数序列之和小于S,扩大序列范围,和中加上big,让big指针不停向后走,直到和为S停止;

23.数组中出现次数超过一半的数字

题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路:

暴力解决:将数组排序,位于中间位置的数字就是超过数组长度一半的那个数。

思路二(有问题):要找的数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。当遍历到下一个数字的时候,如果下一个数字和当前保存的数字相同,则次数加 1;如果和当前保存的数字不同,则次数减 1;当次数减到 0 的时候,将保存的数字改为当前遍历所处的位置,并将次数更改为 1。

思路三:HashMapmap<Integer,Integer>map = new HashMap<Integer,Integer>()用map,一个存数字,一个存次数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 4,180评论 0 23
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,824评论 0 2
  • 说明: 本文中出现的所有算法题皆来自牛客网-剑指Offer在线编程题,在此只是作为转载和记录,用于本人学习使用,不...
    秋意思寒阅读 1,171评论 1 1
  • -楔子- 听着听着 雨点碎了 秋风也醉了 吹着吹着 枫叶红了 萧瑟也浓了 等着等着 初雪来了 寒冬也慌了 看着看着...
    iyunyi阅读 173评论 0 0
  • 00:20分,我写下这篇文章,我想说说我的爸爸,可是脑子里关于爸爸的印象却很模糊……很奇怪,明明去年在老家过了个寒...
    九龙飞天阅读 455评论 0 2