力扣训练——数论

这篇博客涵盖了多种编程算法实现,包括计数质数、七进制数转换、十六进制数转换、Excel列名生成、阶乘后零的个数、二进制求和、字符串相加、数组元素最小移动次数、多数元素查找、判断完全平方数、3的幂验证、数组乘积计算以及三数最大乘积计算。涉及的算法和数据结构基础广泛,适合编程初学者和进阶者学习。
摘要由CSDN通过智能技术生成

本篇参照大佬博客练习题顺序,代码都是自打的,有些可能不是最优解。

目录

204. 计数质数

504. 七进制数

405. 数字转换为十六进制数

168. Excel表列名称

172. 阶乘后的零

67. 二进制求和

415. 字符串相加

462. 最少移动次数使数组元素相等 II

169. 多数元素

367. 有效的完全平方数

326. 3的幂

238. 除自身以外数组的乘积

628. 三个数的最大乘积


204. 计数质数

class Solution {
public:
    int countPrimes(int n) {
        int pr[n+1],s=0;
        for(int i=2;i<n;i++)
        {
            pr[i]=0;
        }
        for(int i=2;i<n;i++)
        {
            if(pr[i]==0)
            {
                for(int j=2*i;j<n;j+=i)
                {
                    pr[j]=1;
                }
            }
        }
        for(int i=2;i<n;i++)
        {
            if(pr[i]==0)
            s++;
        }
        return s;
    }
};

504. 七进制数

class Solution {
public:
    string convertToBase7(int num) {
        string ans="";
        int n=abs(num);
        if(n==0)
        {
            ans='0';
            return ans;
        }
        while(n)
        {
            ans+='0'+n%7;
            n/=7;
        }
        if(num<0)
        ans+='-';
        //cout<<ans;
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

405. 数字转换为十六进制数

class Solution {
public:
    string toHex(long long num) {
        string ans="",y="";
        long long k=4294967296;
        if(num<0)
        num=k+num;
        if(num==0)
        return "0";
        while(num)
        {
            int x=num%16;
            num/=16;
            if(x<10)
            y+=(x+'0');
            else if(x==10)
            y+='a';
            else if(x==11)
            y+='b';
            else if(x==12)
            y+='c';
            else if(x==13)
            y+='d';
            else if(x==14)
            y+='e';
            else if(x==15)
            y+='f';
        }
        for(int i=y.size()-1;i>=0;i--)
        ans+=y[i];
        return ans;
    }
};

168. Excel表列名称

class Solution {
public:
    string convertToTitle(int n) {
        string  ans="",y="";
        while(n)
        {
            int x=n%26;
            n/=26;
            if(x==0)
            x=26,n--;
            y+=(x-1+'A');
            
        }
        for(int i=y.size()-1;i>=0;i--)
        ans+=y[i];
        return ans;
    }
};

172. 阶乘后的零

class Solution {
public:
    int trailingZeroes(int n) {
        int i=1,k=5,s=0;
        while(k<=n)
        {
            s+=floor(n*1.0/k);
            k*=5;
        }
        return s;
    }
};

67. 二进制求和

class Solution {
public:
    string addBinary(string a, string b) {
        int i=a.size()-1,j=b.size()-1;
        int flag=0;
        string k="",ans="";
        while(i>=0||j>=0||flag)
        {
            int x,y;
            if(i<0)
            x=0;
            else
            x=a[i]-'0';
            if(j<0)
            y=0;
            else
            y=b[j]-'0';
            k+=((x+y+flag)%2+'0');
            flag=(x+y+flag)/2;
            i--;
            j--;
        }
        for(int l=k.size()-1;l>=0;l--)
        {
            ans+=k[l];
        }
        return ans;
    }
};

415. 字符串相加

class Solution {
public:
    string addStrings(string num1, string num2) {
        string ans="",s="";
        int flag=0;
        for(int i=num1.size()-1,j=num2.size()-1;;)
        {
            int k=num2[j]-'0'+num1[i]-'0'+flag;
            if(k>=10)
            {
                s+=to_string(k-10);
                num1[i]='0';
                num2[j]='0';
                flag=1;
            }
            else
            {
                s+=to_string(k);
                num1[i]='0';
                num2[j]='0';
                flag=0;
            }
            //cout<<s<<endl;
            if(i==0&&j==0)
            break;
            if(i>0)
            i--;
            if(j>0)
            j--;
        }
        if(flag)
        s+=to_string(flag);
        for(int i=s.size()-1;i>=0;i--)
        {
            ans+=s[i];
        }
        return ans;
    }
};

462. 最少移动次数使数组元素相等 II

class Solution {
public:
    int minMoves2(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        int k=nums[n/2],s=0;
        for(int i=0;i<n;i++)
        {
            s+=abs(nums[i]-k);
        }
        return s;
    }
};

169. 多数元素

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int s=1,k=nums[0];
        for(int i=1;i<nums.size();i++)
        {
            if(k==nums[i])
            s++;
            else
            s--;
            if(s==0)
            {
                s=1;
                k=nums[i];
            }
        }
        return k;
    }
};

367. 有效的完全平方数

class Solution {
public:
    bool isPerfectSquare(int num) {
        for(int i=2;i<=min(num,1000000);i++)
        {
            int s=0;
            while(num%i==0)
            {
                s++;
                num/=i;
            }
            if(s%2==1)
            return false;
        }
        if(num==1)
        return true;
        else
        return false;
    }
};

326. 3的幂

class Solution {
public:
    bool isPowerOfThree(int n) {
        if(n<=0)
        return false;
        while(n>1)
        {
            if(n%3==0)
            n/=3;
            else
            return false;
        }
        return true;
    }
};

238. 除自身以外数组的乘积

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int k=1;
        vector<int>ans;
        int flag=0;
        for(int i=0;i<nums.size();i++)
        {
            if(flag==0)
            {
                if(nums[i]==0)
                flag=1;
                else
                k*=nums[i];
            }
            else
            k*=nums[i];
        }
        for(int i=0;i<nums.size();i++)
        {
            if(flag==0)
            ans.push_back(k/nums[i]);
            else
            {
                if(nums[i]==0)
                ans.push_back(k);
                else
                ans.push_back(0);
            }
        }
        return ans;
    }
};

628. 三个数的最大乘积

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int k=nums.size();
        if(nums[0]<0&&nums[1]<0)
        {
            if(nums[k-1]>=0)
            {
                int max1=max(nums[0]*nums[1],nums[k-3]*nums[k-2]);
                return max1*nums[k-1];
            }
            else
            {
                return nums[k-1]*nums[k-2]*nums[k-3];
            }
        }
        else
        {
             return nums[k-1]*nums[k-2]*nums[k-3];
        }
        
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最长公共前缀是指一组字符串中,所有字符串都有的最长的前缀。根据提供的代码,可以看出这是一个用C语言实现的求解最长公共前缀的函数。函数的输入是一个字符串数组和数组的大小,输出是一个字符指针,指向最长公共前缀的起始位置。 这个函数的实现思路是,首先取数组中第一个字符串的第一个字符作为初始比较字符,然后遍历数组中的每个字符串的相同位置的字符,如果有不相同的字符,则退出循环。如果所有字符串的相同位置的字符都相同,则将初始比较字符更新为下一个位置的字符,继续比较下一位置的字符,直到遍历完所有字符串或者找到不相同的字符。最后,将最长公共前缀的末尾字符置为'\0',返回最长公共前缀的起始位置。 这个函数的时间复杂度是O(n*m),其中n是字符串数组的大小,m是最长公共前缀的长度。 #### 引用[.reference_title] - *1* *2* [力扣:最长公共前缀(详解)](https://blog.csdn.net/weixin_73142957/article/details/129778838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [力扣——14. 最长公共前缀——最长公共前缀C语言解法](https://blog.csdn.net/qq_42479987/article/details/116953103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值