当前位置:   article > 正文

每日5题Day6 - LeetCode 26 - 30

每日5题Day6 - LeetCode 26 - 30

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

第一题:26. 删除有序数组中的重复项 - 力扣(LeetCode)

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. if(nums.length == 1){
  4. return 1;
  5. }
  6. int slow = 0;
  7. for(int fast = 1; fast < nums.length; fast++){
  8. //快慢指针
  9. if(nums[fast] != nums[fast - 1]){
  10. slow++;
  11. nums[slow] = nums[fast];
  12. }
  13. }
  14. return slow + 1;
  15. }
  16. }

第二题:27. 移除元素 - 力扣(LeetCode)

  1. class Solution {
  2. public int removeElement(int[] nums, int val) {
  3. int l = 0;
  4. for(int r = 0; r < nums.length; r++){
  5. //这比上一题还简单... 快慢指针
  6. if(nums[r] != val){
  7. nums[l] = nums[r];
  8. l++;
  9. }
  10. }
  11. return l;
  12. }
  13. }

第三题:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

  1. class Solution {
  2. public int strStr(String haystack, String needle) {
  3. if (haystack == null || needle == null || needle.length() == 0) {
  4. return -1;
  5. }
  6. int[] lps = computeLPSArray(needle);
  7. int i = 0, j = 0;
  8. while (i < haystack.length()) {
  9. if (needle.charAt(j) == haystack.charAt(i)) {
  10. i++;
  11. j++;
  12. }
  13. if (j == needle.length()) {
  14. return i - j;
  15. }
  16. if (i < haystack.length() && needle.charAt(j) != haystack.charAt(i)) {
  17. if (j != 0) {
  18. j = lps[j - 1];
  19. } else {
  20. i = i + 1;
  21. }
  22. }
  23. }
  24. return -1;
  25. }
  26. private int[] computeLPSArray(String pattern) {
  27. //KMP算法
  28. int length = pattern.length();
  29. int[] lps = new int[length];
  30. int i = 1, j = 0;
  31. lps[0] = 0; // lps[0] 总是0
  32. while (i < length) {
  33. if (pattern.charAt(i) == pattern.charAt(j)) {
  34. lps[i] = j + 1;
  35. i++;
  36. j++;
  37. } else {
  38. if (j != 0) {
  39. j = lps[j - 1];
  40. } else {
  41. lps[i] = 0;
  42. i++;
  43. }
  44. }
  45. }
  46. return lps;
  47. }
  48. }

第四题:29. 两数相除 - 力扣(LeetCode)

  1. class Solution {
  2. static final int MAX = Integer.MAX_VALUE;
  3. static final int MIN = Integer.MIN_VALUE;
  4. public int divide(int dividend, int divisor) {
  5. // 溢出情况
  6. if (dividend == MIN && divisor == -1) {
  7. return MAX;
  8. }
  9. // 记录结果的符号
  10. int sign = -1;
  11. if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) {
  12. sign = 1;
  13. }
  14. // 全部转换成负数,防止溢出
  15. dividend = dividend > 0 ? -dividend : dividend;
  16. divisor = divisor > 0 ? -divisor : divisor;
  17. int ans = 0;
  18. // 倍乘法,注意都是负数了,比较的时候与正数相反
  19. // 简单点理解,就是每次减去除数的 2^x 倍数,剩下的部分继续按这样的规则继续
  20. while (dividend <= divisor) {
  21. int tmp = divisor, count = 1;
  22. // 这里注意不要写成 tmp + tmp >= dividend,这样写加法有可能会溢出导致死循环
  23. while (tmp >= dividend - tmp) {
  24. // tmp 和 count 每次增加一倍,所以叫倍增
  25. tmp += tmp;
  26. count += count;
  27. }
  28. // 被除数减去除数的 2^x 倍数做为新的被除数
  29. dividend -= tmp;
  30. // count 即 2^x
  31. ans += count;
  32. }
  33. return sign < 0 ? -ans : ans;
  34. }
  35. }

 第五题:30. 串联所有单词的子串 - 力扣(LeetCode)

  1. class Solution {
  2. public List<Integer> findSubstring(String s, String[] words) {
  3. List<Integer> res = new ArrayList<Integer>();
  4. int m = words.length, n = words[0].length(), ls = s.length();
  5. // 遍历可能的起始位置
  6. for (int i = 0; i < n; i++) {
  7. // 如果剩余字符串长度小于总单词长度,跳出循环
  8. if (i + m * n > ls) {
  9. break;
  10. }
  11. // 用于存储单词出现次数的映射
  12. Map<String, Integer> differ = new HashMap<String, Integer>();
  13. // 计算子串中每个单词的出现次数
  14. for (int j = 0; j < m; j++) {
  15. String word = s.substring(i + j * n, i + (j + 1) * n);
  16. differ.put(word, differ.getOrDefault(word, 0) + 1);
  17. }
  18. // 减少words数组中每个单词的计数
  19. for (String word : words) {
  20. differ.put(word, differ.getOrDefault(word, 0) - 1);
  21. if (differ.get(word) == 0) {
  22. differ.remove(word);
  23. }
  24. }
  25. // 滑动窗口检查子串
  26. for (int start = i; start < ls - m * n + 1; start += n) {
  27. // 移动窗口时调整映射
  28. if (start != i) {
  29. String word = s.substring(start + (m - 1) * n, start + m * n);
  30. differ.put(word, differ.getOrDefault(word, 0) + 1);
  31. if (differ.get(word) == 0) {
  32. differ.remove(word);
  33. }
  34. word = s.substring(start - n, start);
  35. differ.put(word, differ.getOrDefault(word, 0) - 1);
  36. if (differ.get(word) == 0) {
  37. differ.remove(word);
  38. }
  39. }
  40. // 如果映射为空,表示子串中包含了所有单词
  41. if (differ.isEmpty()) {
  42. res.add(start);
  43. }
  44. }
  45. }
  46. return res;
  47. }
  48. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/615492
推荐阅读
相关标签
  

闽ICP备14008679号