当前位置: 首页 > 面试经验 >

8.12 京东笔试(后端)

优质
小牛编辑
78浏览
2023-08-12

8.12 京东笔试(后端)

3a

第一题:字符串(操作1:字符串的第一位移到最后一位,操作2:某个位置的字母为任意字母)求最少操作使字符串变成回文串

#include <iostream>
using namespace std;
int n;
string s;
int solve(int pos){
    int ans=0;
    for(int i=pos;i<(pos+n +pos)/2;i++){
        if(s[i]!=s[pos+n-i-1+pos]){
            ans++;
        }
    }
    return pos+ans;
}
int main() {
    cin>>n>>s;
    s+=s;
    int ans=1e9;
    for(int pos=0;pos<n;pos++){
        ans=min(ans,solve(pos));
    }    
    cout<<ans<<endl;
}
// 64 位输出请用 printf("%lld")

第二题,对数组最后两个数可以执行两个操作,操作1:(x+y)%10, 操作2:(x*y)%10,操作完后将最后两位删除,操作1或操作2的值加入数组最后一位,共执行n-1次操作,求数组剩下的数分别为0,1,2,..., 9的方案数

#include <iostream>
using namespace std;
#define int long long
const int maxn=2e5+100;
const int mod=1e9+7;
int a[maxn];
int n;
int dp[maxn][10];
signed main() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    if(n==1&&a[n]>=10){
        for(int i=0;i<10;i++){
            cout<<"0 ";
        }
        return 0;
    }
    dp[0][a[n]%10ll]=1;
    for(int i=1;i<=n-1;i++){
        int pos=n-i;
        
        for(int num=0;num<10;num++){
            //操作1
            dp[i][(num+a[pos])%10ll]+=dp[i-1][num];
            dp[i][(num+a[pos])%10ll]%=mod;  
            //操作2
            dp[i][(num*a[pos])%10ll]+=dp[i-1][num];
            dp[i][(num*a[pos])%10ll]%=mod;
        }
    }
    for(int i=0;i<10;i++){
        cout<<dp[n-1][i]<<" ";
    }
    puts("");
}
// 64 位输出请用 printf("%lld")

第三题 求图上所有的4个点组成正方形的总方案数,最多2500个点

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

string s[55];
int n,m;
bool cmp(pair<int,int> &a,pair<int,int> &b){
    return a.first<b.first&&a.second<b.second;
}
vector<pair<int,int> >node;
map<pair<int,int>,int> mp;

pair<int,int> del(pair<int,int> &a,pair<int,int> &b){
    return {(a.first-b.first),(a.second-b.second)};
}
pair<int,int> add(pair<int,int> &a,pair<int,int> &b){
    return {{a.first+b.first},{a.second+b.second}};
}
bool check(pair<int,int> dir1,pair<int,int> dir2,pair<int,int> be){
    pair<int,int> p1=add(be,dir1);
    pair<int,int> p2=add(be,dir2);
    pair<int,int> p3=add(p2,dir1);
    if(mp[p1]==1&&mp[p2]==1&&mp[p3]==1) {
		
		//printf("(%d,%d),(%d,%d),(%d,%d),(%d,%d)\n",be.first+1,be.second+1,p1.first+1,p1.second+1,p2.first+1,p2.second+1,p3.first+1,p3.second+1);
		return 1;
	}
    else return 0;
    
}
int main() {
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>s[i];
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i][j]=='X'){
                node.push_back({i,j});
                mp[{i,j}]=1;
            }
        }
    }
    int ans=0;
    for(int i=0;i<node.size();i++){
        pair<int,int> be=node[i];
        for(int j=i+1;j<node.size();j++){
            pair<int,int> next=node[j];
            pair<int,int> dir1=del(next,be);
            pair<int,int> dir2={-dir1.second,dir1.first};

        	if(check(dir1,dir2,be)){
        		ans++;
			}

        }
    }
    cout<<ans/2<<endl;
}
/*
4 4
XX..
XXX.
.X.X
..X.
*/

 类似资料: