好未来2019校招笔试 2018.8.28
题目一 和为3的个数
给定一组长数字,切割使得各部分3的倍数个数最多
例 12345 12,3,45
输出 3
思路:如果各位加和是3的倍数,那么能被3整除
python版本
import sys
def res(x):
num = 0
sum = 0
for i in range(len(x)):
sum += int(x[i])
if (sum % 3 == 0):
num += 1
sum = 0
return num
for line in sys.stdin:
x = line.strip()
print(res(x))
c++版本
#include <bits/stdc++.h>
using namespace std;
int main() {
string str;
cin>>str;
int sum=0;
int num=0;
for(int i=0;i<str.size();i++){
sum+=str[i]-'0';
if(sum%3==0) {
num++;
sum=0;
}
}
cout<< num <<endl;
return 0;
}
题目二:x+y=x|y
输出第k个满足x+y=x|y的数
输入t行 每行 x,k
例:
1
4 2
输出:2
#include <bits/stdc++.h>
using namespace std;
int main() {
long long t,x,k,ans,i,j,a,lenX,lenK,lenA;
int posX[100],posK[100],posA[100];
cin>>t;
while (t--){
memset(posX,0, sizeof(posX));
cin>>x>>k;
i=0,ans=0;
while (x>0){
posX[i++]=x&1;
x=x>>1;
}
lenX=i;
i=0;
while (k>0){
posK[i++]=k&1;
k=k>>1;
}
lenK=i;
for(i=0,j=0,a=0;j<lenK;i++){
if(posX[i]==0)
posA[a++]=posK[j++];
else posA[a++]=0;
}
lenA=a;
for(i=lenA-1;i>=0;i--){
ans=ans<<1;
ans=ans|posA[i];
}
cout<<ans<<endl;
}
}
题目三:打印数组组合
固定数组{0,1,2,3,4,5,6,7,8,9}
一个布尔数组,例如{0,1,1,1,1,1,1,1,1,0}
0可以选择也可以不选择
打印数组组合所有情况
012345678
0123456789
12345678
123456789
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int a[10]={0,1,2,3,4,5,6,7,8,9};
int pos[10],i,p[10];
set<string> v;
void Print(){
string s="";
for(i=0;i<10;i++){
if(p[i]==1)
s+=a[i]+'0';
}
v.insert(s);
}
int main() {
for(i=0;i<10;i++)
cin>>pos[i];
int add = 0,tmp;
while (1){
int flag=0;
for(i=9;i>=0;i--){
if(p[i]==0){
flag=1;
}
}
if(flag==0){
break;
}
//打印
tmp=add++;
for(i=9;i>=0;i--){
p[i]=pos[i];
if(pos[i]==0){
p[i]=tmp&1;
tmp=tmp/2;
}
}
Print();
}
set<string>::iterator it;
for(it=v.begin();it!=v.end();it++){
cout<<*it<<endl;
}
}
题目四 :求摇色子期望
n面 m面有奖励,求期望
6 1
1 1 1 1 1 1
import sys
n,m=input().split()
a=int(n)-int(m)
sum=0
line=list(map(int,input().split()))
for x in line:
sum=sum+x
print('%.2f' % (sum/a) )
题目五: 单调递增序列最大和
输入 5 1 3 4 9 7 6 8
输出 23
维持一个数组sum sum[i]包含当前位置i的最大递增子序列和
python版本
import sys
line=list(map(int,input().split()))
sum=[0]*len(line)
for i in range(len(line)):
sum[i]=line[i]
for j in range(i):
if line[j]<line[i]:
sum[i]=max(sum[i],sum[j]+line[i])
max_sum=sum[0];
for x in sum:
max_sum=max(x,max_sum)
print(max_sum)
c++版
#include <bits/stdc++.h>
using namespace std;
const int nmax=105;
int main() {
int a[nmax];
int n=0;
while(cin>>a[n++]);
n-=1;
int sum[n];
for(int i=0;i<n;i++){
sum[i]=a[i];
for(int j=0;j<i;j++){
if (a[j]<a[i])
sum[i]=max(sum[i],sum[j]+a[i]);
}
}
int max_sum=sum[0];
for(int i=1;i<n;i++){
if(sum[i]>max_sum)
max_sum=sum[i];
}
cout<< max_sum <<endl;
return 0;
}
题目六 替换字符串
#include <bits/stdc++.h>
using namespace std;
#define ll long long
void string_replace( string &strBig, const string &strsrc, const string &strdst) {
int pos = 0;
int srclen = strsrc.size();
int dstlen = strdst.size();
while ((pos = strBig.find(strsrc, pos)) != string::npos) {
strBig.replace(pos, srclen, strdst);
pos += dstlen;
}
}
int main() {
string str,s,p;
getline(cin,str);
cin>>s>>p;
string_replace(str, s, p);
cout << str << endl;
}