早期代码使用 java , 后转c/c++。由于使用java代码的都是比较基础的题目,因此未贴出java代码。
1035. Password (20)
原题地址:http://www.patest.cn/contests/pat-a-practise/1035
解题思路:简单字符串替换。
1036. Boys vs Girls (25)
原题地址:http://www.patest.cn/contests/pat-a-practise/1036
解题思路:分别保存boy和girl的分数最值。
1037. Magic Coupon (25)
原题地址:http://www.patest.cn/contests/pat-a-practise/1037
解题思路:先排序,然后依次正值和正值相乘,负值和负值相乘。
代码如下:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int cmp(const void*,const void*);
int n,m;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// freopen("input.txt","r",stdin);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
scanf("%d",&n);
int *v1 = new int[n];
for(int i=0;i<n;i++){
scanf("%d",(v1+i));
}
scanf("%d",&m);
int *v2 = new int[m];
for(int i=0;i<m;i++){
scanf("%d",(v2+i));
}
int count = 0;
sort(v1,v1+n);
sort(v2,v2+m);
for(int i=0;i<m&&i<n;++i){
if(v1[i]>0||v2[i]>0)
break;
count += v1[i]*v2[i];
}
for(int i=n-1,j=m-1;i>=0&&j>=0;--i,--j){
if(v1[i]<0||v2[j]<0)
break;
count += v1[i]*v2[j];
}
// printf("%d:%d:%d:%d\n",v1[0],v1[1],v1[2],v1[3]);
printf("%d\n",count);
return 0;
}
1038. Recover the Smallest Number (30)
原题地址:http://www.patest.cn/contests/pat-a-practise/1038
解题思路:对于数A和数B,若AB > BA, 定义 A > B。 可以证明,这种比较规则的有效性:自反性,对称性,传递性。 因此按照定义的规则对数组排序即可。(详见《剑指offer(纪念版)》 面试题33)
代码如下:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstring>
using namespace std;
struct num{
char s[15];
}name[10005];
bool cmp(const struct num &a,const struct num &b){
char ta[30],tb[30];
strcpy(ta,a.s);
strcpy(tb,b.s);
strcat(ta,b.s);
strcat(tb,a.s);
return strcmp(ta,tb)<0;
}
int main()
{
int n;
// int cmp(const struct num,const struct num);
// freopen("input.txt","r",stdin);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",name[i].s);
}
sort(name,name+n,cmp);
bool flag = true;
for(int i=0;i<n;i++){
char* number = name[i].s;
for(int j=0;number[j]!= '\0';j++){
if(flag && number[j]=='0')
continue;
flag = false;
printf("%c",number[j]);
}
}
if(flag){
printf("0\n");
}
return 0;
}
1039. Course List for Student (25)
原题地址:http://www.patest.cn/contests/pat-a-practise/1039
解题思路:由于map对字符串处理比较慢,因此根据学生名特点自定义一个映射关系,把学生名映射到数组里。
代码如下:
#include <stdio.h>
#include <vector>
#include <cstring>
#include <algorithm>
#define MAXN 26*26*26*10+5
using namespace std;
/*==================================
!!!! cin is slow; map is slow!!!!!!!
==================================*/
vector<int> smap[MAXN];
int N,K;
int hashName(const char* name){
return (name[0] - 'A') * 26 * 26 * 10\
+ (name[1] - 'A') * 26 * 10\
+ (name[2] - 'A') * 10\
+ (name[3] - '0');
}
int main(){
// freopen("1039.txt","r",stdin);
scanf("%d%d",&N,&K);
for(int i = 0; i < K; i++){
int cid, sn;
scanf("%d%d",&cid,&sn);
for(int j = 0; j < sn; j++){
char name[5];
scanf("%s",name);
smap[hashName(name)].push_back(cid);
}
}
for(int i = 0; i < N; i++){
char name[5];
scanf("%s",name);
int hname = hashName(name);
int msize = smap[hname].size();
sort(smap[hname].begin(),smap[hname].end());
printf("%s %d",name,msize);
for(int i = 0; i < msize; i++){
printf(" %d",smap[hname][i]);
}
printf("\n");
}
return 0;
}
1040. Longest Symmetric String (25)
原题地址:http://www.patest.cn/contests/pat-a-practise/1040
解题思路:想不出好办法。暴力找以每一位为中心向两边展开得到的对称字符串的长度。注意字符串长为奇数和偶数的区别。(网上有动态规划的方法)
代码如下:
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define MAXN 1005
char mes[MAXN];
int len;
int maxN;
int maxT;
int isSym(const char *a, int s){
if(s > len) return 1;
if(s%2 == 0){
for(int i = s/2; (i + s/2)<= len; i++){
int flag = 0;
for(int t = 0; t < s/2; t++)
if(a[i-t-1] != a[i+t]){
flag = 1;
break;
}
if(flag) continue;
return 0;
}
}else{
for(int i = s/2; (i + s/2)< len; i++){
int flag = 0;
for(int t = 1; t <= s/2; t++)
if(a[i-t] != a[i+t]){
flag = 1;
break;
}
if(flag) continue;
return 0;
}
}
return 1;
}
int main(){
// freopen("1040.txt","r",stdin);
gets(mes);
len = strlen(mes);
int flag = 0;
maxN = 2;
maxT = 1;
while(!flag){
int a = isSym(mes, maxN);
int b = isSym(mes, maxN+1);
if(!a) maxT = maxN;
if(!b) maxT = maxN;
maxN++;
if(a*b) flag = 1;
}
printf("%d",maxT);
return 0;
}
1041. Be Unique (20)
原题地址:http://www.patest.cn/contests/pat-a-practise/1041
解题思路:用数组记录每个数字出现的次数。再对数据依次查询,找出现次数为1的数。
1042. Shuffling Machine (20)
原题地址:http://www.patest.cn/contests/pat-a-practise/1042
结题思路:按照规则交换数组元素即可。
代码如下:
#include <cstdio>
#include <cstring>
#define MAXN 54
int pre[MAXN];
int cur[MAXN];
int ord[MAXN];
int k;
int main(){
// freopen("1042.txt","r",stdin);
int flag = 1;
scanf("%d",&k);
for(int i = 0; i < MAXN; i++){ scanf("%d",&ord[i]); pre[i] = i;}
for(int i = 0; i < MAXN; i++){
int index = i;
for(int j = 0; j < k; j++)
index = ord[index] - 1;
cur[index] = pre[i];
}
char c;
int f = 1;
for(int i = 0; i < MAXN; i++){
if(cur[i]/13 == 0) c = 'S';
else if(cur[i]/13 == 1) c = 'H';
else if(cur[i]/13 == 2) c = 'C';
else if(cur[i]/13 == 3) c = 'D';
else c = 'J';
if(f) f = 0;
else printf(" ");
printf("%c%d", c, cur[i]%13+1);
}
return 0;
}
1043. Is It a Binary Search Tree (25)
原题地址:http://www.patest.cn/contests/pat-a-practise/1043
解题思路:按照前序遍历构造BST,过程中检查是否为BST。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1005
int left[MAXN];
int right[MAXN];
int val[MAXN];
int data[MAXN];
int p;
int N;
int isBST(int s, int t){
int f = s;
int i;
if(s >= t ) return 1;
for(i = s+1; i < t; i++){
if(data[s] <= data[i]) break;
}
f = i;
for(;i < t; i++){
if(data[s] > data[i]) return 0;
}
if(s+1 < f) left[s] = s+1;
if(s < f && f < t) right[s] = f;
return isBST(s+1,f)&&isBST(f,t);
}
int ismBST(int s, int t){
int f = s;
int i;
if(s >=t ) return 1;
for(i = s+1; i < t; i++){
if(data[s] > data[i]) break;
}
f = i;
for(;i < t; i++){
if(data[s] <= data[i]) return 0;
}
if(s+1 < f) left[s] = s+1;
if(s<f && f < t) right[s] = f;
return ismBST(s+1,f)&&ismBST(f,t);
}
void showVal(int r){
if(left[r] != -1) showVal(left[r]);
if(right[r] != -1) showVal(right[r]);
if(p) p = 0;
else printf(" ");
printf("%d",data[r]);
}
int main(){
memset(left,-1,sizeof(left));
memset(right,-1,sizeof(right));
memset(val,0,sizeof(val));
// freopen("1043.txt","r",stdin);
scanf("%d",&N);
for(int i = 0; i < N; i++) scanf("%d",data+i);
int f1 = isBST(0,N);
int f2 = 0;
if(!f1) f2 = ismBST(0,N);
if(f1 || f2){
printf("YES\n");
p = 1;
showVal(0);
}else printf("NO\n");
return 0;
}
1044. Shopping in Mars (25)
原题地址:http://www.patest.cn/contests/pat-a-practise/1044
解题思路:窗口法查找数组连续元素和。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MAXN 100005
using namespace std;
int data[MAXN];
int maxC[MAXN];
int des[MAXN];
int N;
int M;
int ma;
vector<int> v;
int mmax(int i, int j){
if(i > j) return i;
else return j;
}
int main(){
// freopen("1044.txt","r",stdin);
memset(maxC,0,sizeof(maxC));
scanf("%d%d",&N,&M);
for(int i = 0 ; i < N; i++) scanf("%d",data+i);
ma = 100000010;
int pr = 0;
int mt = 0;
for(int i = 0; i < N; i++){
for(int j = mmax(pr,i); j < N; j++){
mt += data[j];
// printf("%d-%d : %d\n",i+1,j+1,mt);
if(mt >= M){
pr = j;
if(mt < ma){ ma = mt; v.clear(); v.push_back(i);}
else if(mt == ma) v.push_back(i);
des[i] = j;
break;
}
}
if(mt < M) break;
else {
mt -= data[i];
if(pr > i) mt = mt - data[pr];
}
}
for(int i = 0 ; i < v.size(); i++){
printf("%d-%d\n",v[i]+1,des[v[i]]+1);
}
}
1045. Favorite Color Stripe (30)
原题地址:http://www.patest.cn/contests/pat-a-practise/1045
解题思路:求非减最大子数组,动态规划。
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<sstream>
using namespace std;
int dp[10005];
int num[205];
int stripe[10005];
int main()
{
// freopen("1045.txt","r",stdin);
int n,m,k,ans,x;
memset(num,-1,sizeof(num));
scanf("%d",&n);
scanf("%d",&m);
for(int i=1; i<=m; ++i)
{
scanf("%d",&x);
num[x]=i;
}
scanf("%d",&k);
for(int i=1; i<=k; ++i)
{
scanf("%d",&x);
stripe[i]=num[x];
}
for(int i=1; i<=k; ++i)
{
if(stripe[i]>0) dp[i]=1;
else dp[i]=0;
}
for(int i=2; i<=k; ++i)
{
if(stripe[i]==-1)
dp[i]=0;
else
{
for(int j=1; j<i; ++j)
if(stripe[i]>=stripe[j])
dp[i]=max(dp[i],dp[j]+1);
}
}
ans=0;
for(int i=1; i<=k; ++i)
if(dp[i]>ans)
ans=dp[i];
printf("%d\n",ans);
return 0;
}
解题思路:简单字符串替换。
代码如下: