leetcode面试算法题
1.数组/字符串
1.1合并两个有序数组
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = 0;//遍历数组1int p2 = 0;//遍历数组2int[] nums3 = new int[m + n];int p = 0;while (p1 < m && p2 < n) {//当数组1、2都没遍历完nums3[p++] = nums1[p1] <= nums2[p2] ? nums1[p1++] : nums2[p2++];}while (p1 < m) {nums3[p++] = nums1[p1++];}while (p2 < n) {nums3[p++] = nums2[p2++];}for (int i = 0; i < m + n; i++) {nums1[i] = nums3[i];}}
}
1.2移除元素
class Solution {public int removeElement(int[] nums, int val) {if(nums.length<1) return 0;int l = 0;int r = nums.length - 1;int res = 0;while (l < r) {if (nums[l] == val) {//换到最末尾的元素一定是和val相同,但换过来的元素还没比较,因此不能直接l--swap(l, r--, nums);} else {res++;//数组有效长度+1l++;}}if (nums[l] != val) {res++;}return res;}public void swap(int a, int b, int[] nums) {int temp = nums[a];nums[a] = nums[b];nums[b] = temp;}
}
2.哈希表
2.1有效的字母异位词
class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) return false;int[] num = new int[26];for (int i = 0; i < s.length();i++){num[s.charAt(i)-'a']++;num[t.charAt(i)-'a']--;}for (int i : num) {if (i!=0){return false;}}return true;}
}
2.2快乐数
解释:由于我们知道int的最大值为2147483647,而在这个数字之内的最大的next(next 为各位数字的平方和)。是1999_999_999 (1999_999_999 = 1*1 + 9*9*9(一共有9位数位9))。
根据以上表格,我们可以发现,即使数字很大,next 范围也会跌下来,很快陷入 [1,243] 这个范围内,这是因为即使是1999_999_999,在经过一次运算以后,也会变成730,而730在[100,999]这个范围之内,说明之后进行快乐数运算,一定会在[1,243]这个范围之内!
所以在有限次循环之内,就会出现相同的值。接下来面临循环或者达到 1 退出。这是典型的环形链表问题,我们可以通过快慢指针来解决。
class Solution {public boolean isHappy(int n) {int m = getNext(getNext(n));//快指针,每次进行两次运算while (m != n) {m = getNext(getNext(m));n = getNext(n);}if (m == 1) {//比较最后相遇的值return true;}return false;}public int getNext(int n) {//获取当前n的下一个数int sum = 0;while (n > 0) {int m = n % 10;n = n / 10;sum += m * m;}return sum;}
}