常见的面试算法题以及解题思路
- 1:有序数组求,给出sum, sum = a+b,找出a,b。
- 2:无序数组求,给出sum, sum = a+b,找出a,b。
- 3:字符串反转
- 4:判断链表中是否存在环结构
- 5:无序数组求倒数第K大的数值
- 6:出现频率最多的K 个元素
- 7:数组第 [n,m]中出现x的次数
- 8:[a,b,c,d ,e,f]倒转为[e,f , a,b,c,d]
1:有序数组求,给出sum, sum = a+b,找出a,b。
思路:因为是有序数组,可以用前后指针,让
a[min]+a[max] 的值与sum的大小比较。
如果 大于 sum的值,那么说明数字太大了,max 值需要减1
如果 小于 sum的值,那么说明数字太小了,min值需要进行加1。
如果 小于 sum的值,那么找到了这个值。
直到 max < min时,程序退出,没有找到。
2:无序数组求,给出sum, sum = a+b,找出a,b。
这道题用不了上一道题的做法了。
这道题可以借助hashMap来做,key为值数组的值,value为数组的下标(如果有重复值,我们应该只记一个就可以了,或者可以都记下来)。
1:遍历数组,当前下标 i ,看 【sum-i】是否在 hashMap里面,
2:如果在,说明找到了 a+b=sum,
3:如果 不在,那么把 (data[i],i) 放进hashMap里面。
3:字符串反转
用前后指针,把指针位置的值进行调换,然后同时向中间逼近。
同样的题目如:
反转特殊字符
判断回文字符
4:判断链表中是否存在环结构
两个指针,一个指针前进2格,一个指针前进一格,如果最终他们会相遇,那么说明存在环。
5:无序数组求倒数第K大的数值
利用快排思想,如果基准正好为第K 个,那么就是要找的值。
6:出现频率最多的K 个元素
桶的思想,第 i 个桶装的是出现了 i 次的元素。
一般的思维是 存储 元素 x,以及出现的次数 numX。
我们的思路刚好反过来了,存储 numX,以及元素 x1,x2,x3。
按照字符出现次数对字符串排序 也可以利用这种思想。
7:数组第 [n,m]中出现x的次数
正常情况下,简单计数就可以了。
这题要有个要求,就是 这种计算是非常非常多的,数组不变,但是计算特别多,比如它会输入参数:
[
[2,5,6], //从下标 2到5里面 6 出现的个数
[3,8,9], //从下标 3到8里面,9出现的个数
[1,8,3]
]
,而我们需要返回的也是一个数组,表示出现的次数。
做法:hashMap 存储 值,以及值出现的下标位置。
8:[a,b,c,d ,e,f]倒转为[e,f , a,b,c,d]
题目理解:
S1:a,b,c,d
S2:e,f
让S1与S2对调。
解题:
1:S1进行倒序
2:S2进行倒序
3:整体进行倒序。
倒序用双指针。