知名互联网公司校招中常见的算法题(11-13)
题目11:两数之和
题目描述:
给定一个整数数组 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);
}
throw new IllegalArgumentException("No two sum solution");
}
题目12:两数相加
题目描述:
给定两个非空链表,表示两个非负整数。它们每位数字都是按照逆序方式存储的,并且每个节点只能存储一位数字。将这两个数相加,返回一个新的链表表示它们的和。
解决思路:
我们可以用迭代的方法来解决这个问题。我们遍历两个链表,同时将它们的值相加,并将结果存储在新链表中。需要注意的是,如果其中一个链表为空,我们要将它的值视为 0。
代码实现:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
int
题目13:字符串转换整数 (atoi)
题目描述:
int n = myAtoi(str);
请你来实现一个 atoi 函数,使其能将字符串转换成整数。该函数可以通过以下方式被调用:
解决思路:
我们可以用一个变量来记录当前数字的符号,同时用另一个变量来记录当前数字的值。遍历字符串,如果遇到数字,就将它加入当前数字的值中;如果遇到正负号,就记录当前数字的符号;如果遇到空格,就忽略;如果遇到其他字符,就停止遍历,返回当前数字的值。
代码实现:
public int myAtoi(String str) {
int sign = 1;
int num = 0;
int i = 0;
// Skip leading whitespace
while (i < str.length() && str.charAt(i) == ' ') {
i++;
}
// Check for sign
if (i < str.length() && (str.charAt(i) == '+' || str.charAt(i) == '-')) {
sign = (str.charAt(i) == '-') ? -1 : 1;
i++;
}
// Build number
while (i < str.length() && Character.isDigit(str.charAt(i))) {
int digit = str.charAt(i) - '0';
// Check for overflow
if (num > Integer.MAX_VALUE / 10 || (num == Integer.MAX_VALUE / 10 && digit > 7)) {
return (sign == -1) ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
num = num * 10 + digit;
i++;
}
return sign * num;
}