算法练习(1)

题目一:回文数(难度:简单)

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

思路:通过获得x的每位数,直接将数值倒序,然后对比x即可。

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

题目二:有效的括号(难度:简单)

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

思路:通过栈来存储每个左括号,出现右括号便对栈顶进行比较。若不相等,返回false;若栈为空,说明该右括号多余,返回false。最后,若栈不空,说明栈中有左括号没有匹配,返回false;若栈空,说明括号有效,返回true。

bool isValid(char * s){
    char a[10000];
    int top=-1,i=0;
    while(s[i]){
        if(s[i]=='('||s[i]=='['||s[i]=='{')
            a[++top]=s[i];
        else if(top!=-1&&s[i]==')'){
            if(a[top]!='(') return false;
            top--;
        }
        else if(top!=-1&&s[i]==']'){
            if(a[top]!='[') return false;
            top--;
        }
        else if(top!=-1&&s[i]=='}'){
            if(a[top]!='{') return false;
            top--;
        }
        else return false;
        i++;
    }
    if(top==-1)
        return true;
    else return false;
}

题目三:删除有序数组中的重复项(难度:简单)

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

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

思路:由于给定数组已经排序,直接通过一次遍历整个数组,定义两个变量,一个存储新数组中的最后一个数的下标;另一个遍历原数组,若有新的非重复值,将其值赋值给第一个变量的下一个数。

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

题目四:比较版本号(难度:中等)

给你两个版本号 version1 和 version2 ,请你比较它们。

版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。

比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 1 。

返回规则如下:

如果 version1 > version2 返回 1,
如果 version1 < version2 返回 -1,
除此之外返回 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compare-version-numbers

思路:将两个版本号'.'号前的修订号依次转换为整数进行比较即可。

int compareVersion(char * version1, char * version2){
    int l1=strlen(version1),l2=strlen(version2);
    int i=0,j=0;
    while(i<l1||j<l2){
        int x=0,y=0;
        for(;i<l1&&version1[i]!='.';i++){
            x=x*10+version1[i]-'0';
        }
        i++;
        for(;j<l2&&version2[j]!='.';j++){
            y=y*10+version2[j]-'0';
        }
        j++;
        if(x!=y){
            if(x<y) return -1;
            else if(x>y) return 1;            
        }
    }
    return 0;
}

题目五:整数反转(难度:中等)

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer

思路:整型变量反转直接通过求余计算,要求反转后的整数不超过[-2^31,2^31-1]这个范围,直接在返回前进行判断即可。

int reverse(int x){
    long long int n=0;
    while(x){
        n=n*10+x%10;
        x/=10;
    }
    if(n>pow(2,31)-1||n<-pow(2,31)) return 0;
    return n;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值