力扣训练——数论

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

目录

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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值