0
点赞
收藏
分享

微信扫一扫

力扣 1

夕阳孤草 2022-04-06 阅读 112
java

文章目录

简单题

罗马数字转整数

解题思路

  • 将字符串拆分放到字符数组里面。
  • 将特殊情况依次写出来,记住当两个字符满足上述关系时,同时需要加上i+1,避免i重复使用。
  • 其余情况直接加上相应数字即可

解题代码

class Solution {
    public int romanToInt(String s) {
       int sum=0;
        char[] s1=new char[s.length()+1];
        for(int i=0;i<s.length();i++){
            s1[i]=s.charAt(i);
        }
        for(int i=0;i<s.length()+1;i++){
            if(s1[i]=='X'&&s1[i+1]=='L'){
                sum+=40;
                i=i+1;
            }else if(s1[i]=='X'&&s1[i+1]=='C'){
                sum+=90;
                i=i+1;
            }else if(s1[i]=='I'&&s1[i+1]=='V'){
                sum+=4;
                i=i+1;
            }else if(s1[i]=='I'&&s1[i+1]=='X'){
                sum+=9;
                i=i+1;
            }else if(s1[i]=='C'&&s1[i+1]=='D'){
                 sum+=400;
                 i=i+1;
            }else if(s1[i]=='C'&&s1[i+1]=='M'){
                sum+=900;
                i=i+1;
            }else if(s1[i]=='M'){
                sum+=1000;
            }else if(s1[i]=='I'){
                sum+=1;
            }else if(s1[i]=='X'){
                sum+=10;
            }
            else if(s1[i]=='V'){
                sum+=5;
            }
            else if(s1[i]=='C'){
                sum+=100;
            }else if(s1[i]=='D'){
                sum+=500;
            }else if(s1[i]=='L'){
                sum+=50;
            }
        }
        return sum;
    }
}

删除有序数组中的重复项

解题思路

  • 先定义一个与原数组长度相同的目标数组e
  • 题目说了,数组升序。可以通过第一个比第二个、第二个比第三个…的思想去删除重复数字,(相同的元素一定在旁边,升序)
  • 当i与i+1元素相同时,通过将从下标i+1到下标结束往前移一位,即删去下标为i的这个元素,同时保留i+1
  • 删除完元素后,数组也重新更新,i-1是因为i后面的元素都移前一位,i+1这个元素变成i,所有i-1,同时数组大小也要-1

解题代码

class Solution {
    public int removeDuplicates(int[] nums) {
  
      int[]  e=new int[nums.length];
      int sum=0;
      int len=nums.length;
      for(int i=0;i<len-1;i++){
          if(nums[i]==nums[i+1]){
              sum++;
              for(int j=i;j<len-1;j++){
                  nums[j]=nums[j+1];
              }
              i--;
              len--;
          }
      }
      return  len;
    }
}

斐波那契数

解题思路

  • 找到终止条件n=0,f=0,n=1,f=1
  • 题目给出了递归关系F(n) = F(n - 1) + F(n - 2)
  • 进行递归思想列出f=fib(n-1)+fib(n-2);即可

解题代码

class Solution {
    public int fib(int n) {
    int f;
        if(n==0){
            f=0;
        }
        else if(n==1){
            f=1;
        }else{
            f=fib(n-1)+fib(n-2);
        }
        return f;
    }
}

检测大写字母

解题思路

  • 对字符串进行拆分,定义flag=true.定义两个变量a=0,b=0分别记录大写以及小写的个数
  • 第一种情况:都为大写字母 a=word.length
  • 第二种情况:都为小写字母 b=word.length
  • 第三种情况:第一个为大写其余小写(b=word.length()-a)同时满足都一个为大写
  • 其余flag=false
  • 返回flag

解题代码

class Solution {
    public boolean detectCapitalUse(String word) {
   int a=0,b=0;
      boolean flag=true;
      for(int i=0;i<word.length();i++){
          if(word.charAt(i)>='A'&&word.charAt(i)<='Z'){
              a++;
          }
          if(word.charAt(i)>='a'&&word.charAt(i)<='z'){
              b++;
          }
      }
      if(a==word.length()||b==word.length()){
          flag=true;
      }else if((b==word.length()-a)&&a==1&&(word.charAt(0)>='A'&&word.charAt(0)<='Z')){
          flag=true;
      }else {
          flag=false;
      }
        return flag;
    }
}

中等题

只出现一次的数字II

解题思路

  • 我是先对数组进行了排序,通过Arrays.sort
  • 我分了几种特殊情况(找到只出现一次数字的下标定义为b)
  • 1.如果只有一个元素,直接返回
  • 2.如果最后一个元素与前一个元素不等,b=nums.length-1
  • 3.如果第一个元素与第二个元素不等,b=0
  • 4.即不再第一个,也不再最后一个,通过比较,如果该下标元素不等于前一个也不等于后一个,b=i
  • 5.返回nums[b]

解题代码

class Solution {
    public int singleNumber(int[] nums) {
 
      Arrays.sort(nums);
      int b=0;
      if(nums.length==1){
          b=0;
      } else if(nums[0]!=nums[1]){
          b=0;
      }else if(nums[nums.length-1]!=nums[nums.length-2]){
          b=nums.length-1;
      }else{
          for(int i=1;i<nums.length-1;i++){
              if(nums[i]!=nums[i+1]&&nums[i]!=nums[i-1]){
                  b=i;
              }
          }
      }
       return nums[b];
    }
}
举报

相关推荐

0 条评论