169、
本题要求给定数组,求出数组中出现最多的数。
1、常规方法是排序之后,检查nums[i]==nums[i+1],随后计数并与max对比。当max最大时,nums[i]就是所求数。
2、还有另一种方法,按我的理解是“抵消法”。因为题目中要求出现次数最多的数的次数大于n/2,也就是长度为7时次数为4,8时次数为5。因此可使用抵消法。
初始化count=1,res = nums[0]。
然后从进行计数,然后检查后面那个数是否相等,不等就count-1,相等就count+1。当count=0时,res = nums[i],重新定义nums。直至循环结束。
这种方法相当于是将两组前后不相等的数进行抵消。
例如:{1,2,1,1,3,1,2,1,}
此时,1和2抵消。1再和3抵消,count = count-1 =1,1再和2抵消,最后还有一个1.因此1就是目标数字。
122、
这道题在discuss中的争议非常大,许多人认为这是一道废题。因为其中有一种方法可以非常快速的解决。题目比较复杂,就不介绍。简单来说就是可以看成寻找数组中的每一个递增序列,并将每一个序列中的最大值和最小值相减得到值加起来就是结果。
217、
这道题寻找数组中是否有重复数字,思想非常简单。有多种方法。
1、最简洁方法,使用return IntStream.of(nums).distinct().count<nums.length;
一行代码解决。
2、使用HashSet实现。
3、数组排序。
717、
这道题规定一位数‘0’和两个二位数‘10’,‘11’,现在给定一个数组,在确定最后一个数字为0的情况下判断最后一个数字是否为一位数。
这道题的关键是从最后一位数开始进行判断。判断与最后的0相连的1的个数。
1、如果最后为。。。。00,那么可以肯定最后的0肯定是1位数。
2、如果最后为。。。。1。。。10,此时就要讨论1的个数的奇偶性。
如果1为奇数,则为false,偶数,则为true。