前言:为了加深对语言的理解我在别人的推荐之下开始做力扣的题(我还是一个学生)
从今天开始我会每天做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))
比较结果