凯撒密码

题意:根据偏移量求出偏移后的字符串。
思路:因为题目限制了只有大小写字符和数字,那么我们就先将它们的相对位置关系存放在一个temp数组里面,然后根据偏移量进行映射即可。
代码:

class Solution {
public:
    /**
     * 解密密文
     * @param str string字符串 密文
     * @param d int整型 偏移量
     * @return string字符串
     */
     string temp="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    string decode(string str, int d) {
        // write code here
        int len=str.size();
        int l=temp.size();
        for(int i=0;i<len;i++){
            int id;
            if(str[i]<='9'&&str[i]>='0')  id=str[i]-'0';
            else if(str[i]<='Z'&&str[i]>='A')  id=str[i]-'A'+10;
            else  id=str[i]-'a'+36;
            if(id>=d)  str[i]=temp[id-d];
            else  str[i]=temp[l-d+id];
        }
        return str;
    }
};

完全平方数的尾巴

思路:打表。我们通过打表,我们可以发现满足题目条件的只有159个数,那么先打表,然后一个一个判断即可。
代码:

class Solution {
public:
    /**
     * 
     * @param x int整型 
     * @return bool布尔型
     */
     int a[159]={0,1,4,9,16,24,25,36,41,44,49,56,64,76,81,84,89,96,100,104,116,121,124,129,136,144,156,161,164,169,176,184,196,201,204,209,216,224,225,236,241,244,249,256,264,276,281,284,289,296,304,316,321,324,329,336,344,356,361,364,369,376,384,396,400,401,404,409,416,424,436,441,444,449,456,464,476,481,484,489,496,500,504,516,521,524,529,536,544,556,561,564,569,576,584,596,600,601,604,609,616,624,625,636,641,644,649,656,664,676,681,684,689,696,704,716,721,724,729,736,744,756,761,764,769,776,784,796,801,804,809,816,824,836,841,844,849,856,864,876,881,884,889,896,900,904,916,921,924,929,936,944,956,961,964,969,976,984,996};
    bool solve(int x) {
        // write code here
        for(int i=0;i<159;i++){
            if(a[i]==x)  return true;
        }
        return false;
    }
};

排队

题意:n个人,m个窗口,给出求出每个人完成办理之后的时间的逆序对。
思路:既然是排队,我们很自然就想到要用队列来进行模拟,先求出每个人的办理时长。这里由于m个窗口都的人会变动的,我们就用一个有限队列来进行存储,我们先把m个0放进去,然后遍历n个人的时间,每次取出队首的元素,对应这个人的就是队首时间加上他的办理时间。求出tim数组之后,题目就转化为求逆序对的个数的一个题目了,板子题,用归并排序求得即可。
代码:

class Solution {
public:
    /**
     * 求解合法的(i,j)对的数量
     * @param n int整型 n个人
     * @param m int整型 m个窗口
     * @param a int整型vector 长度为n的vector,顺序表示1-n号客人的办理业务所需时间
     * @return long长整型
     */
     typedef long long ll;
     priority_queue<ll,vector<ll>,greater<ll> > q;
     ll tim[100010];
     ll temp[100010];
     ll sum=0;
     void merge(int L,int R){
         int mid=(L+R)>>1;
         int k=1,l=L,r=mid+1;
         while(l<=mid&&r<=R){
             if(tim[l]<=tim[r]){
                 temp[k++]=tim[l++];
             }
             else{
                 sum+=mid+1-l;
                 temp[k++]=tim[r++];
             }
         }
         while(l<=mid) temp[k++]=tim[l++];
         while(r<=R)  temp[k++]=tim[r++];
         k=1;
         for(int i=L;i<=R;i++,k++){
             tim[i]=temp[k];
         }
     }
     void mergesort(int l,int r){
         if(l<r){
             int mid=(l+r)>>1;
             mergesort(l,mid);
             mergesort(mid+1,r);
             merge(l,r);
         }
     }
    ll getNumValidPairs(int n, int m, vector<int>& a) {
        // write code here
        for(int i=0;i<m;i++){
            q.push(0);
        }
        for(int i=0;i<n;i++){
            ll t=q.top()+a[i];
            tim[i]=t;
            q.pop();
            q.push(t);
        }
        mergesort(0,n-1);
        return sum;
    }
};