常见的面试算法题以及解题思路

  • 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:整体进行倒序。
倒序用双指针。