0
点赞
收藏
分享

微信扫一扫

算法练习(2)

夕颜合欢落 2022-03-11 阅读 77

题目一:搜索插入位置(难度:简单)

思路:直接通过二分查找,时间复杂度即为O(log n);返回应插入的位置即为左边界的值。

int searchInsert(int* nums, int numsSize, int target){
    int low=0;
    int high=numsSize-1;
    while(low<=high){
        int mid=(high+low)/2;
        if(nums[mid]==target){
            return mid;
        }
        else if(nums[mid]<target){
            low=mid+1;
        }
        else if(nums[mid]>target){
            high=mid-1;
        }
    }
    if(target>nums[0])
        return low;
    return 0;
}

题目二:最后一个单词的长度(难度:简单)

思路:反向遍历字符串,但出现字母时计数,直到下一个空格为止

class Solution {
public:
    int lengthOfLastWord(string s) {
         int index=0,flag=0;
         for(int i=s.length()-1;i>=0;i--){
             if(s[i]!=' '){
                 flag=1;
                 index++;
                 continue;
             }
             else if(flag==1) break;
         }
         return index;
    }
};

题目三:字符串中的单词数(难度:简单)

思路:先查看字符串是否为空串,再看字符串开头是否有空格,若有计数先自减1;之后遍历数组,每个字母前有空格则计数自加1

class Solution {
public:
    int countSegments(string s) {
        if(s.length()==0) return 0;
        int index=1;
        if(s[0]==' ') index--;
        for(int i=0;i<s.length()-1;i++){
            if(s[i]==' '&&s[i+1]!=' ') index++;
        }
        return index;
    }
};

题目三:回文素数(难度:中等)

思路:分别判断该数是否为回文和素数,长度为8的数可以直接跳过,因为没有长度为8的素数

int rev(int num){
    int a[10]={};
    int i=0;
    while(num!=0){
        a[i++]=num%10;
        num/=10;
    }
    for(int j=0;j<i/2;j++){
        if(a[j]!=a[i-j-1])
        return 0;
    }
    return 1;
}

int prime(long long int num){
    int flag=0;  
    for(long long int i=2;i<=num/2;i++){
        if(num%i==0) {
            flag=1;break;
        }
    }
    if(flag==0)
        if(num<2)return 0;
        else return 1;
    else return 0;
}

int func(long long int a){
    for(;;a++){
        if(a>=10000000&&a<=99999999) continue;
        if(rev(a)&&prime(a)){
            return a;
        }
    }
}

int primePalindrome(int n){
    int a=func(n);
    return a;
}

题目五:颜色分类(难度:中等)

void sortColors(int* nums, int numsSize){
    int indexA=0;
    int indexB=0;
    int indexC=0;
    for(int i=0;i<numsSize;i++){
        if(nums[i]==0){
            indexA++;
        }
        else if(nums[i]==1){
            indexB++;
        }
        else indexC++;
    }
    for(int i=0;i<indexA;i++){
        nums[i]=0;
    }
    for(int i=0;i<indexB;i++){
        nums[indexA+i]=1;
    }
    for(int i=0;i<indexC;i++){
        nums[indexA+indexB+i]=2;
    }
}
举报

相关推荐

2.22 算法练习

2.27 算法练习

算法练习(3)

2.24 算法练习

基础算法练习

0 条评论