我的leetcode之旅

前言:为了加深对语言的理解我在别人的推荐之下开始做力扣的题(我还是一个学生)
从今天开始我会每天做1~3道(具体时间具体安排)并且使用三种语言(c,java,python)

开始吧

5.19

1.两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

c

/**
 * Note: The returned array must be malloced, assume caller calls free().
 * 暴力算
 * 等我以后变得更好之后一定要用别的算法
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    //int* 指针 动态分配内存
    int *lst = (int*)malloc(sizeof(int) * 2);
    lst[0] = 0;
    lst[1] = 0;
    int i,b;
    for(i=0;i<numsSize - 1;i++)
    {
        for(b=i+1;b<numsSize ;b++)
        {
            if(nums[i]+nums[b]==target)
            {
                lst[0] = i;
			    lst[1] = b;
			    *returnSize = 2;
			    return lst;
            }
        }
    }
    return 0;
}

java

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for(int i=0;i<nums.length-1;i++)
        {
             for(int j=i+1;j<nums.length;j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    return new int[] { i, j };
                   
                }
            }
        }
      throw new IllegalArgumentException("No two sum solution");  
    }
   
}

python

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        size = len(nums)
        for i, m in enumerate(nums):
            j = i + 1
            while j < size:
                if target == (m + nums[j]):
                    return [i, j]
                else:
                    # print(i, j, m + _n, " didn't match!")
                    j += 1
                    

执行区别
在这里插入图片描述

5.20

1.整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

C

int reverse(int x){
 long count=0;//需要返回的数
    while(x!=0){
        count=count*10+x%10;//每次取出最后一位,并让他的前一位*10
        x=x/10;//去掉每次的最后一位
    }
    return count>2147483647||count<-2147483648?0:count;//规定在32位之内
}

我在devc++中没有编出来
开始的时候报错c [Warning] this decimal constant is unsigned only in ISO C90 [enabled by default]
搜索结果如下:C语言中常量值默认是一个32位的有符号整型数。由于2394967295无法用32位的有符号整型数表示,所以会有报警产生,即该问题通常出现在默认型存储不够的情况下。
解决办法如下
1 在常数后面增加一个U标识,如果是long或longlong类型加UL或ULL,如4286545791U进行类型强制转换,这样就不会报警了
2 使用十六进制的数字,如0xFFFFFFFF
3 使用gcc -std=c99 用99标准来编译
后来发现原来编译标准与力扣中不同不是c99
更改设置如下
工具->编译选项->编译器选项卡中,在"编译时加入以下命令"复选框前打钩,里面输入命令 -std=c99 (与GCC不同,这里c99中的字母c是小写)
问题就解决了

java

class Solution {
    public int reverse(int x) {
        int  a=0;
        while(x!=0)
        {
           if ((x > 0 && a > ((Integer.MAX_VALUE - (x % 10)) / 10))
                        || (x < 0 && a < ((Integer.MIN_VALUE - (x % 10)) / 10))) {
                    return 0;
                }
            a=a*10+x%10;
            x=x/10;
        }
        return a;
    }
}

PS:
提交的时候不停报错解题思路都一样就是语法不同
在这里插入图片描述
最后解决问题的方法是
判断溢出没有追加x>0或x<0的条件,这时候会有个问题,MAX_VALUE减去一个负数或者MIN_VALUE加上一个负数将会直接溢出。

python

class Solution(object):
    def reverse(self, x):
        ans = 0
        flag = 1
        if x <0:
            x = -x;
            flag = -flag

        while x  != 0:
            cur = x % 10
            ans = ans*10 + cur
            x //= 10
        return ans*flag if -2**31 <ans*flag <2**31 else 0


执行结果
在这里插入图片描述

5.21

1.判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

输入: 121
输出: true
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

解题思路
利用回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数,求出逆序后的整数,判断是否相等即可。
注意:
1、负数直接返回false
2、给出的数在逆序后可能超过int范围,可以赋值给long后再逆序
昨天做的那个返回倒数的就可以利用上直接进行比较

C

bool isPalindrome(int x){
   if (x < 0)
        return false;
    long tmp = x, y = 0;
    while (tmp) {
        y = y * 10 + tmp % 10;
        tmp /= 10;
    }

    return x == y;

}

ps
第一次提交就超出了int的范围唉
在这里插入图片描述

java

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0)
        {
            return false;
        }
        else
        {
            long s=(long)x,a=0;
            while(s!=0)
            {
                a=a*10+s%10;
                s=s/10;
            }
            return a==x;

        }
    }
}

python

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0: # 如果为负数,直接返回 false
            return False
        num = x
        cur = 0
        while num !=0:
            cur = cur*10 + num%10
            num //=10
        return cur == x # 最后比较 数值反转前后是否相等

区别如下:
在这里插入图片描述

5.22

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

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/roman-to-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

例如, 罗马数字 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 到 3999 的范围内。
示例 1:

输入: "III"
输出: 3

示例 2:

输入: "IV"
输出: 4

示例 3:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

这个思路我感觉用switch合适在配合if
后来感觉好麻烦看看某些大佬是怎么解的吧
在这里插入图片描述
大佬的解题思路可是C语言的hashmap还没有自学到
在想想别的吧(java的和C语言的有点 不同,感觉java的map好一点,个人想法)
C

int reverse_num(char s){
    int num[] = {1,5,10,50,100,500,1000},i = 0;
    char *roman = "IVXLCDM";

    while(s != roman[i]){
        i++;
    }
//是罗马数字与整数一一对应
    return num[i];
}

int romanToInt(char * s){
    int count = reverse_num(s[0]),pre = reverse_num(s[0]);
    for(int i = 1;s[i] != '\0';i++){
        if(pre < reverse_num(s[i])){
            count = count + reverse_num(s[i]) - pre*2;
        }else
            count += reverse_num(s[i]);
        pre = reverse_num(s[i]);
    }
//数字的比较如果左边比右边小就先加上大的数在减去小的数二倍
    return count;
} 

java

这个用了switch比较的部分还是一样

class Solution {
    public int romanToInt(String s) 
    {
        int sum = 0;
        int preNum = getValue(s.charAt(0));//变成数字提取数
        for(int i = 1;i < s.length(); i ++) {
            int num = getValue(s.charAt(i));
            if(preNum < num) {
                sum -= preNum;
            } else {
                sum += preNum;
            }
            preNum = num;
        }
        sum += preNum;
        return sum;


    }
    private int getValue(char ch) 
    {
        switch(ch) {
            case 'I': return 1;
            case 'V': return 5;
            case 'X': return 10;
            case 'L': return 50;
            case 'C': return 100;
            case 'D': return 500;
            case 'M': return 1000;
            default: return 0;
        }
    }
}

**python **

用了字典,下面有点不懂唉

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'I':1, 'IV':3, 'V':5, 'IX':8, 'X':10, 'XL':30, 'L':50, 'XC':80, 'C':100, 'CD':300, 'D':500, 'CM':800, 'M':1000}
        return sum(d.get(s[max(i-1, 0):i+1], d[n]) for i, n in enumerate(s))

比较结果
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值