面试常问的算法题整理
1、 给定一个字符串,逐个翻转字符串中的每个单词
l1 = "This is a good example".split(" ")
print(l1)
l2 = []
new_str = ""
for i in l1:
l2.append(i)
print(l2)
n = 0
while l2:
if n == 0:
new_str += l2.pop()
else:
new_str += " " + l2.pop()
n += 1
print(new_str)2、 判断数组中所有的数字是否只出现一次
arr = [1, 2, 3, 1]
d1 = {}
status = True
for i in arr:
if not d1.get(i):
d1[i] = 1
status = True
else:
status = False
break
print(status)3、 无重复字符的最长子串
public static int lengthOfLongestSubstring(String s) {
if (s.equals(" ")){
return 1;
}
// 滑窗
LinkedList linkedList = new LinkedList();
// 最大互异连续子串大小
int size = 0;
char[] chars = s.toCharArray();
for (int i = 0; i
if (!linkedList.contains(chars[i])){
linkedList.addLast(chars[i]);
size = linkedList.size() > size ? linkedList.size() : size;
}else {
size = linkedList.size() > size ? linkedList.size() : size;
while (linkedList.removeFirst() != chars[i]){}
linkedList.addLast(chars[i]);
}
}
return size;
}4、反转链表
/** * @Author Liruilong * @Description 链表反转 * @Date 16:58 2019/9/2 * @Param [listNode1] * @return void **/ public static void linkInt(ListNode listNode1){ // 链表的反转, // 思路一: 递归反转法,在反转当前节点之前先反转后续节点,从头节点开始 // 思路二:遍历反转法: 从前往后反转各个节点的指针域指向. } // 递归反转 public static ListNode Reverse(ListNode listNode){ if ( listNode == null || listNode.next ==null){ return listNode; } ListNode reNode = Reverse(listNode.next); listNode.next.next = listNode; listNode.next = null; return reNode; } // 遍历反转 public static ListNode Reverses(ListNode listNode){ if (listNode == null){ return listNode; } // 上一节点 ListNode prt = listNode; // 当前节点 ListNode cur = listNode.next; // 临时节点 ListNode temp ; while (cur != null){ temp = cur.next; cur.next = prt;// 反转指针域的指向 prt = cur; // 指针往下移动 cur = temp; } listNode.next = null; return prt; }
5、给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++){
for (int j = i + 1; j <nums.length; j++){
if (nums[i] + nums[j] == target){
return new int[]{i,j};
}
}
}
return new int[]{};
}6、二叉树的最近公共父亲节点
public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//发现目标节点则通过返回值标记该子树发现了某个目标结点
if(root == null || root == p || root == q) return root;
//查看左子树中是否有目标结点,没有为null
TreeNode left = lowestCommonAncestor(root.left, p, q);
//查看右子树是否有目标节点,没有为null
TreeNode right = lowestCommonAncestor(root.right, p, q);
//都不为空,说明做右子树都有目标结点,则公共祖先就是本身
if(left!=null&&right!=null) return root;
//如果发现了目标节点,则继续向上标记为该目标节点
return left == null ? right : left;
}
}7、写一个函数,找出一个整数数组中,第二大的数
function bubbleSort(arr){
var len = arr.length;
for(var i=0; i<len; i++){ //总共需要比较的轮数
for(var j=0; j<len-1-i; j++){ // 每一轮需要进行比较的数字
if( arr[j]<arr[j+1]){ // 相邻元素相比,小的移至到右边
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr[1];
}算法题基本在面试时都会遇到,因为他是对我们代码能力的直观体现,可以这样说,如果在面试时算法题写不出来,甚至连大体思路都讲不出来,那面试想通过就比较难了,所以大家需要好好准备,为了节省大家的时间,我帮大家整理好了(看这里 ),拿下offer就看它了!
#Android##算法##面试##秋招##算法工程师#