力扣 1

简单题

罗马数字转整数
  1. 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2
写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。
但也存在特例,例如 4 不写做 IIII,而是 IV。
数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = “III” 输出: 3
示例 2:
输入: s = “IV” 输出: 4

解题思路

  • 将字符串拆分放到字符数组里面。
  • 将特殊情况依次写出来,记住当两个字符满足上述关系时,同时需要加上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;
    }
}
删除有序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

解题思路

  • 先定义一个与原数组长度相同的目标数组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;
    }
}
斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例 1:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

解题思路

  • 找到终止条件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;
    }
}
检测大写字母

我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如 “USA” 。
单词中所有字母都不是大写,比如 “leetcode” 。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
示例 1:
输入:word = “USA”
输出:true
示例 2:
输入:word = “FlaG”
输出:false

解题思路

  • 对字符串进行拆分,定义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

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:

输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99]
输出:99

解题思路

  • 我是先对数组进行了排序,通过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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值