首页 > 其他分享 >c语言 -我与letcode相爱相杀

c语言 -我与letcode相爱相杀

时间:2023-03-11 13:33:45浏览次数:40  
标签:返回 相爱 nums int 相杀 元素 数组 letcode 输入

有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。

1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。
示例:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

解决方法:

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i,j=0,len,sum=0;
    len = numsSize;
    //创建一个新数组
    int *result =NULL;
    result = (int *)malloc(sizeof(int)*2);
    while(j<len-1){
       for(i=j+1;i<len;i++){
            sum = nums[j]+nums[i];
            if(sum==target){
                result[0]=j;
                result[1]=i;
                *returnSize=2;
                return result;
            }else{
                sum=0;
            }
        } 
        j++;
    }
    //返回长度
    *returnSize=0;
    return result;
}

9.回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。
示例:

输入:x = 121
输出:true

解决方法:

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

13.罗马数字转整数

罗马数字包含以下七种字符: 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。
给定一个罗马数字,将其转换成整数。

输入: s = "III"
输出: 3

解决方法:

int rback(char ch);
int romanToInt(char *s){
    int sum=0;
    int len =strlen(s);
    for(int i=0;i<len;i++){
        if(i!=len-1){
            if(s[i]=='I'){
                if(s[i+1]=='V'||s[i+1]=='X')//你只管继续加,我只管我自己的减
                    sum =sum-2;
            }else if(s[i]=='X'){
                if(s[i+1]=='L'||s[i+1]=='C')//你只管继续加,我只管我自己的减
                    sum =sum-20;
            }else if(s[i]=='C'){
                if(s[i+1]=='D'||s[i+1]=='M')//你只管继续加,我只管我自己的减
                    sum =sum-200;
            }
        }
        sum =sum+rback(s[i]);
    }
    return sum;
}
int rback(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;
        case 'a': return 4;
        case 'b': return 9;
        case 'c': return 40;
        case 'd': return 90;
        case 'e': return 400;
        case 'f': return 900;
    }
    return 0;
}

26. 删除有序数组中的重复项

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

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

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例:

输入: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 。不需要考虑数组中超出新长度后面的元素。

解决方法:

int removeDuplicates(int* nums, int numsSize){
    int i=0;
    if(numsSize<=1)
        return numsSize;
    for(int j=1;j<numsSize;j++){
        if(nums[i]!=nums[j]){
            nums[++i]=nums[j];
        }
    }
    return i+1;
}

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

解决方法:

int removeElement(int* nums, int numsSize, int val){
    int j=0;
    for(int i =0;i<numsSize;i++){
        if(nums[i]!=val){
            nums[j++]=nums[i];
        }
    }
    return j;
}

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。
示例:

输入: nums = [1,3,5,6], target = 5
输出: 2

解决方法:

int searchInsert(int* nums, int numsSize, int target){
    int i;
    for(i=0;i<numsSize;i++){
        if(nums[i]>=target){
            return i;
        }
    }
    return i;
}

58. 最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
示例:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。

解决方法:

int lengthOfLastWord(char * s){
    int i,count=0,flag=0;
    int len = strlen(s);
    for(i=len-1;i>=0;i--){//从后往前数
        if(s[i]==' '){    
            if(flag==0)
                count=0;
            else
                break;
        }else{
            count++;
            flag=1;
        }
    }
    return count;
}

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。

输入:s = "()[]{}"
输出:true

解决方法:

用数组模拟栈
char *s;
int top=-1;
if(top==-1)//栈为空先输入
s[top]=temp;
//入栈
top++;
s[top]=temp;
//出栈
top--;

bool isValid(char * s){
    int i;
    int temp;
    int top = -1;//栈的标值
    int len = strlen(s);
    for(i=0;i<len;i++){
        temp =s[i];
        if(top == -1){//栈为空时
            top++;
            s[top] = temp;
        }else{
            //( [ { 入栈
            if(temp=='('||temp=='['||temp=='{'){
                top++;
                s[top] = temp;
            }else {
                if(temp==')'){
                    if(s[top]=='(')
                        top--;
                    else 
                        return false;
                }else if(temp==']'){
                    if(s[top]=='[')
                        top--;
                    else
                        return false;
                }else if(temp=='}'){
                    if(s[top]=='{')
                        top--;
                    else 
                        return false;
                }
            }
        }
    }
    if(top==-1){
        return true;
    }
    return false;
}

标签:返回,相爱,nums,int,相杀,元素,数组,letcode,输入
From: https://www.cnblogs.com/ZarkY/p/17172462.html

相关文章

  • 4.致父母∶做兄弟应相亲相爱、互相包容
    有问题需要坦诚沟通:亲人之间有什么想法或者矛盾,不要埋在心里,以免产生猜忌。有做得不对的地方,可以郑重的指出来,委婉的指出应当做出的改变。如果有做的不对的地方,就能改......
  • letcode-俩数之和
    暴力枚举1.两数之和给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会......
  • letcode算法--21.螺旋矩阵 II
    给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn 正方形矩阵 matrix 。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]......
  • letcode算法--19.最大子数组和
    给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。方法一:动态规划classSolution......
  • letcode算法--18.全排列
    回溯算法给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2......
  • 同步辐射光源和核物理研究的相爱相生
    关于同步辐射的起源,这篇文章写的比较有趣:闲话同步辐射光源,就不再赘述。国内用作核物理研究的粒子源现状从上面对话截图可窥一斑。里面提到的国内目前能利用做核物理实验......
  • letcode-学习-数组去重
    数组去重问题描述:给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于......
  • IT江湖的故事 | 第六章-各岗位间相爱相杀,有鄙视也各显神通,关于销售、售前、研发、交付
            销售小赵跟着师父销售老张经过多次历练,风风雨雨,逐渐掌握了对项目把控的技巧、能够更好地跟进项目进展了。可也开始了对其他岗位同学的“鄙视”,当然IT江湖各......
  • letcode刷题记录-day01-两数之和
    题目:两数之和描述给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输......
  • letcode刷题记录-day02-回文数
    回文数题目描述给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入......