知名互联网公司校招中常见的算法题(1-5)

题目一:最长回文子串

回文串是指正着读和反着读都一样的字符串。给定一个字符串,求出它的最长回文子串。

解决思路:

我们可以用动态规划来解决这个问题。我们先定义状态:dpi 表示从i到j是否为回文串。则有以下状态转移方程:

dp[i][j] = true (i == j)

dp[i][j] = (s[i] == s[j]) (j = i + 1)

dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1] (j > i + 1)

在这个状态转移方程中,如果 s[i] == s[j],那么 dpi 的值就取决于 dpi + 1 是否为 true。同时,如果 i 和 j 之间只有一个字符,那么它们必定是回文串。

最后,我们可以遍历 dp 数组,找出其中值为 true 的最长子串。

代码实现:

public String longestPalindrome(String s) {

  int n = s.length();

  boolean[][] dp = new boolean[n][n];

  String res = "";

  for (int i = n - 1; i >= 0; i--) {

      for (int j = i; j < n; j++) {

          dp[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 2 || dp[i + 1][j - 1]);

          if (dp[i][j] && j - i + 1 > res.length()) {

              res = s.substring(i, j + 1);
          }
      }
  }
  return res;
}

题目二:两数之和

给定一个整数数组 nums 和一个目标值 target,请在该数组中找出和为目标值的两个整数,并返回它们的下标。

解决思路:

我们可以用哈希表来解决这个问题。遍历一遍数组,用哈希表来记录每个数字出现的位置。对于每个数字 nums[i],我们可以检查哈希表中是否存在 target - nums[i],如果存在,那么就找到了这两个数。

代码实现:

public int[] twoSum(int[] nums, int target) {

  Map<Integer, Integer> map = new HashMap<>();

  for (int i = 0; i < nums.length; i++) {

      int complement = target - nums[i];

      if (map.containsKey(complement)) {

          return new int[] { map.get(complement), i };
      }
      map.put(nums[i], i);
  }
  return null;
}

题目三:反转链表

给定一个链表,反转链表的每个节点。

解决思路:

我们可以用迭代的方法来解决这个问题。遍历一遍链表,用一个 prev 指针记录前一个节点,用一个 cur 指针记录当前节点,用一个 next 指针记录下一个节点。然后每次将当前节点的 next 指向前指向 prev,然后将 prev 指向当前节点,将当前节点指向 next,直到遍历完整个链表。

代码实现:

public ListNode reverseList(ListNode head) {

  ListNode prev = null;

  ListNode cur = head;

  while (cur != null) {

      ListNode next = cur.next;

      cur.next = prev;

      prev = cur;

      cur = next;
  }
  return prev;
}

题目四:二叉树的最大深度

给定一个二叉树,找出其最大深度。

解决思路:

我们可以用递归的方法来解决这个问题。二叉树的最大深度等于左子树的最大深度和右子树的最大深度中的较大值加1。我们可以用递归函数 maxDepth(root) 来计算以 root 为根节点的树的最大深度。

代码实现:

public int maxDepth(TreeNode root) {
   if (root == null) {
       return 0;
  }
   int leftDepth = maxDepth(root.left);

   int rightDepth = maxDepth(root.right);

   return Math.max(leftDepth, rightDepth) + 1;
}

题目五:字符串转整数

将一个字符串转换成整数,如果不能转换则返回 0。

解决思路:

我们可以用模拟的方法来解决这个问题。先去掉字符串前面的空格,然后判断第一个字符是否是正号或负号。然后从第一个非空字符开始遍历字符串,直到遇到非数字字符为止。在遍历的过程中,我们可以用一个变量来记录转换后的结果。如果结果超过了整数的范围,则返回最大值或最小值。

代码实现:

public int myAtoi(String s) {
  int n = s.length();
  int i = 0;
  int sign = 1;
  int res = 0;
 
  while (i < n && s.charAt(i) == ' ') {
      i++;
  }

  if (i < n && (s.charAt(i) == '+' || s.charAt(i) == '-')) {
      sign = s.charAt(i) == '+' ? 1 : -1;
      i++;
  }

  while (i < n && Character.isDigit(s.charAt(i))) {
      int digit = s.charAt(i) - '0';
      if (res > (Integer.MAX_VALUE - digit) / 10) {
          return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
      }
      res = res * 10 + digit;
      i++;
  }
  return sign * res;
}

以上是关于常见算法题的解决思路、代码实现以及实际案例的详细讲解。对于互联网公司的校招来说,掌握这些算法题可以帮助我们更好地应对面试。当然,还需要多多练习,才能真正掌握这些算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值