LeetCode 第20场双周赛 题解

传送门

A 根据数字二进制下的1的数目排序

题目大意

就是名字的字面意思
将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

解题思路

按题意模拟

代码

int cmp(vector<int> a, vector<int> b)
{
    return a[1]<b[1]||(a[1]==b[1]&&a[0]<b[0]);
}
class Solution {
public:
    int calc(int x)
    {
        int ans=0;
        while (x)
        {
            ans+=x&1;
            x>>=1;
        }
        return ans;
    }
    vector<int> sortByBits(vector<int>& arr) {
        vector<vector<int>> Sort;
        int n=arr.size();
        for (int i=0;i<n;++i)
        {
            vector<int> temp;
            temp.push_back(arr[i]);
            temp.push_back(calc(arr[i]));
            Sort.push_back(temp);
        }
        sort(Sort.begin(),Sort.end(),cmp);
        for (int i=0;i<n;++i)
            arr[i]=Sort[i][0];
        return arr;
    }
};

B 每隔 n 个顾客打折

题目大意

有一些顾客要买一些商品,商品的价格和数量给出,商家每隔n个顾客会打折,问每个人实际花销。

解题思路

按题意模拟。。

代码

class Cashier {
public:
    int N,Discount,cnt;
    vector<int> Products,Prices;
    int tot=0;
    Cashier(int n, int discount, vector<int>& products, vector<int>& prices) {
        N=n;
        Discount=discount;
        Products=products;
        Prices=prices;
        cnt=products.size();
    }
    
    double getBill(vector<int> product, vector<int> amount) {
        int n=product.size();
        double p=0;
        ++tot;
        for (int i=0;i<n;++i)
        {
            for (int j=0;j<cnt;++j)
                if (Products[j]==product[i])
                {
                    p+=(double)Prices[j]*(double)amount[i];
                    break;
                }
        }
        if (tot%N==0)
            p=p-((double)Discount*p)/100.0;
        return p;
    }
};

/**
 * Your Cashier object will be instantiated and called as such:
 * Cashier* obj = new Cashier(n, discount, products, prices);
 * double param_1 = obj->getBill(product,amount);
 */

C 包含所有三种字符的子字符串数目

题目大意

给出一个字符串,求包含了三种字符的子字符串数目。

解题思路

双指针,左指针枚举子串的开头,右指针指向符合要求的最短子串结尾(子串结尾在右指针之右的肯定都成立,直接计算),显然两指针单调。

代码

class Solution {
public:
    int numberOfSubstrings(string s) {
        int n=s.length();
        int l=0,r=0,ans=0;
        int a=0,b=0,c=0;
        if (s[0]=='a') ++a;
        else if (s[0]=='b') ++b;
        else ++c;
        while (l<n)
        {
            while (r<n-1&&(!a||!b||!c))
            {
                ++r;
                if (s[r]=='a') ++a;
                else if (s[r]=='b') ++b;
                else ++c;
            }
            if (a&&b&&c)
                ans+=n-r;
            if (s[l]=='a') --a;
            else if (s[l]=='b') --b;
            else --c;
            ++l;
        }
        return ans;
    }
};

D 有效的快递序列数目

题目大意

给出n个二元组,将其合并产生一个长度为2n的排列,其中二元组的内部顺序不能改变,求可能的排列个数。(给出的n个二元组互不相同)。

解题思路

数学题?不不,还是模拟。
一个一个的排,只不过用一个等差数列求和公式这也叫数学题

代码

class Solution {
public:
    int countOrders(int n) {
        if (n==1) return 1;
        int loc=1,ans=1,Mod=1000000007,now;
        for (int i=2;i<=n;++i)
        {
            loc+=2;
            now=(1+loc)*loc/2;
            ans=(int)(((long long)ans*(long long)now)%Mod);
        }
        return ans;
    }
};
购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均达到96,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值