当前位置:   article > 正文

每日5题Day3 - LeetCode 11 - 15

每日5题Day3 - LeetCode 11 - 15

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

第一题:11. 盛最多水的容器 - 力扣(LeetCode)

  1. class Solution {
  2. public int maxArea(int[] height) {
  3. //这道题比较特殊,因为两边是任意选的,
  4. //所以中间可以出现比两边高的情况,实际就是双指针求一个矩形的面积
  5. //宽度为左右边界的差值,高度为左右高度的较小值,所以我们进行模拟
  6. int l = 0, r = height.length - 1, maxres = 0;
  7. while(l < r){
  8. if(maxres < (r - l) * Math.min(height[l], height[r])){
  9. maxres = (r - l) * Math.min(height[l], height[r]);
  10. }
  11. //不断挪动边界,因为宽度是在不断缩小的,那么如果我们挪动较高的那边,
  12. //得到的结果一定比以前小,所以挪动较低的那一边
  13. if(height[l] <= height[r]){
  14. l++;
  15. }else{
  16. r--;
  17. }
  18. }
  19. return maxres;
  20. }
  21. }

第二题:12. 整数转罗马数字 - 力扣(LeetCode)

  1. class Solution {
  2. // 数值对应的罗马数字
  3. int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
  4. // 罗马数字
  5. String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
  6. // 将整数转换为罗马数字
  7. public String intToRoman(int num) {
  8. StringBuilder sb = new StringBuilder();
  9. // 遍历数值对应的数组
  10. for (int i = 0; i < values.length; ++i) {
  11. int value = values[i];
  12. String symbol = symbols[i];
  13. // 当 num 大于等于当前数值时,循环减去该数值,并将对应的罗马数字追加到结果中
  14. while (num >= value) {
  15. num -= value;
  16. sb.append(symbol);
  17. }
  18. // 如果 num 等于 0,表示已经转换完成,直接跳出循环
  19. if (num == 0) {
  20. break;
  21. }
  22. }
  23. // 返回转换后的罗马数字字符串
  24. return sb.toString();
  25. }
  26. }

第三题:13. 罗马数字转整数 - 力扣(LeetCode)

  1. class Solution {
  2. // 将罗马数字转换为整数
  3. public int romanToInt(String s) {
  4. int res = 0; // 结果变量,用于存储转换后的整数值
  5. int preNum = getValue(s.charAt(0)); // 前一个罗马数字对应的整数值
  6. // 遍历字符串 s 中的每个字符
  7. for(int i = 1; i < s.length(); i++){
  8. int num = getValue(s.charAt(i)); // 当前字符对应的整数值
  9. // 如果前一个字符对应的整数值小于当前字符对应的整数值,则将结果减去前一个字符对应的整数值
  10. if(preNum < num){
  11. res -= preNum;
  12. }else{ // 否则,将结果加上前一个字符对应的整数值
  13. res += preNum;
  14. }
  15. preNum = num; // 更新前一个字符对应的整数值为当前字符对应的整数值
  16. }
  17. res += preNum; // 加上最后一个字符对应的整数值
  18. return res; // 返回最终的整数值
  19. }
  20. // 获取字符对应的整数值
  21. private int getValue(char ch){
  22. switch(ch) {
  23. case 'I' : return 1;
  24. case 'V' : return 5;
  25. case 'X': return 10;
  26. case 'L': return 50;
  27. case 'C': return 100;
  28. case 'D': return 500;
  29. case 'M': return 1000;
  30. default: return 0;
  31. }
  32. }
  33. }

第四题:14. 最长公共前缀 - 力扣(LeetCode)

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. class Solution {
  4. // 寻找字符串数组中的最长公共前缀
  5. public String longestCommonPrefix(String[] strs) {
  6. // 根据字符串长度对数组进行排序
  7. Arrays.sort(strs, new Comparator<String>(){
  8. @Override
  9. public int compare(String o1, String o2){
  10. return o1.length() - o2.length();
  11. }
  12. });
  13. // 获取最短字符串的长度
  14. int maxlen = strs[0].length();
  15. int res = 0, index = 0; // res: 公共前缀长度,index: 当前比较的字符索引
  16. // 遍历最短字符串的长度
  17. while(index < maxlen){
  18. char tmpch = '.'; // 临时变量,用于存储当前比较的字符,默认为'.'表示未初始化
  19. // 遍历字符串数组中的每个字符串
  20. for(String st : strs){
  21. // 如果临时字符是'.',则将当前字符作为临时字符
  22. if(tmpch == '.'){
  23. tmpch = st.charAt(index);
  24. }
  25. // 否则,如果当前字符与临时字符不相等,则返回公共前缀(如果 res 不为 0),否则返回空字符串
  26. else{
  27. if(st.charAt(index) != tmpch){
  28. return res != 0 ? strs[0].substring(0, res) : "";
  29. }
  30. }
  31. }
  32. index++; // 移动到下一个字符位置
  33. res++; // 更新公共前缀长度
  34. }
  35. // 返回最长公共前缀
  36. return strs[0].substring(0, res);
  37. }
  38. }

 第五题:15. 三数之和 - 力扣(LeetCode)

  1. class Solution {
  2. // 定义一个方法threeSum,接收一个整数数组nums作为参数,返回所有和为0的三元组
  3. public List<List<Integer>> threeSum(int[] nums) {
  4. // 初始化结果列表
  5. List<List<Integer>> res = new ArrayList<>();
  6. // 对数组进行排序,以便于后续的双指针操作
  7. Arrays.sort(nums);
  8. // 遍历数组,使用i作为第一个数字
  9. for(int i = 0; i < nums.length - 2; i++) {
  10. // 跳过相同的元素,避免重复的三元组
  11. if(i > 0 && nums[i] == nums[i - 1]) {
  12. continue;
  13. }
  14. // 初始化左右指针
  15. int j = i + 1, k = nums.length - 1;
  16. // 使用while循环进行双指针操作,寻找和为0的三元组
  17. while(j < k) {
  18. // 计算当前三元组的和
  19. int cursum = nums[i] + nums[j] + nums[k];
  20. // 如果当前和小于0,说明需要增大和,因此移动左指针j
  21. if(cursum < 0) {
  22. j++;
  23. } else if(cursum > 0) {
  24. // 如果当前和大于0,说明需要减小和,因此移动右指针k
  25. k--;
  26. } else {
  27. // 如果当前和为0,找到了一个三元组
  28. res.add(Arrays.asList(nums[i], nums[j], nums[k]));
  29. // 跳过相同的元素,避免重复的三元组
  30. while(j < k && nums[j] == nums[j + 1]) {
  31. j++;
  32. }
  33. while(j < k && nums[k] == nums[k - 1]) {
  34. k--;
  35. }
  36. // 移动指针继续寻找下一个可能的三元组
  37. j++;
  38. k--;
  39. }
  40. }
  41. }
  42. // 返回所有找到的三元组
  43. return res;
  44. }
  45. }

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

闽ICP备14008679号