凯撒密码
题意:根据偏移量求出偏移后的字符串。
思路:因为题目限制了只有大小写字符和数字,那么我们就先将它们的相对位置关系存放在一个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;
}
};
京公网安备 11010502036488号