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,一个存数字,一个存次数