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

文章提供了三种常见的编程题目的解决方案:1)使用迭代方法反转链表;2)通过哈希表寻找数组中和为目标值的两个数的下标;3)使用双指针在排序数组中找三数之和为零的组合。这些方法展示了数据结构和算法在解决编程问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目21:反转链表

题目描述:

反转一个单链表。

解决思路:

我们可以用迭代的方法来反转链表。我们用两个指针 prev 和 curr 分别指向链表中相邻的两个节点,然后将 curr 的 next 指向 prev,然后将 prev 和 curr 分别向后移动一个节点。直到 curr 为空,此时 prev 指向的节点就是反转后的头节点。

代码实现:

public ListNode reverseList(ListNode head) {
  ListNode prev = null;
  ListNode curr = head;

  while (curr != null) {
      ListNode next = curr.next;
      curr.next = prev;
      prev = curr;
      curr = next;
  }
  return prev;
}

题目22:两数之和

题目描述:

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

解决思路:

我们可以用哈希表来解决这个问题。我们用一个哈希表来存储数组中每个元素的值和它的下标,然后遍历数组,对于每个元素,我们在哈希表中查找是否存在 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 new int[] {};
}

题目23:三数之和

题目描述:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c,使得 a + b + c = 0?找出所有满足条件且不重复的三元组。

解决思路:

我们可以用双指针的方法来解决这个问题。首先,我们将数组排序。然后,我们固定一个数 nums[i],将问题转化为在 nums[i+1:n-1] 中找到两个数之和等于 -nums[i]。我们用两个指针 left 和 right 分别指向 nums[i+1] 和 nums[n-1],然后将它们的和与 -nums[i] 进行比较。如果和小于 -nums[i],就将 left 向右移动一个位置;如果和大于 -nums[i],就将 right 向左移动一个位置。如果和等于 -nums[i],就将这三个数加入结果集中,并分别将 left 和 right 向中间移动一个位置,直到 left 和 right 相遇为止。

代码实现:

public List<List<Integer>> threeSum(int[] nums) {
  List<List<Integer>> res = new ArrayList<>();
  int n =nums.length;
if (n < 3)
{
  return res;
}
Arrays.sort(nums);

for (int i = 0; i < n - 2; i++) {
  if (i > 0 && nums[i] == nums[i - 1]) {
      continue;
  }

  int target = -nums[i];
  int left = i + 1;
  int right = n - 1;

  while (left < right) {
      int sum = nums[left] + nums[right];

      if (sum == target) {
          res.add(Arrays.asList(nums[i], nums[left], nums[right]));
          while (left < right && nums[left] == nums[left + 1]) {
              left++;
          }
          left++;
          while (left < right && nums[right] == nums[right - 1]) {
              right--;
          }
          right--;
      } else if (sum < target) {
          left++;
      } else {
          right--;
      }
  }
}
return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值