去哪儿秋招 java 笔试算法题

1.k-bingo

,给定k,l,r,找出[l,r]区间中满足以下条件之一的数 :

  • x%k==0
  • x,k转为字符串,k是x的子串

模拟 :

java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class t1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in) ;
        int k = sc.nextInt() , l = sc.nextInt() , r = sc.nextInt();
        String ks = String.valueOf(k) ;
        int p = ks.length() ;
        List<Integer> ls = new ArrayList<>() ;
        for(int i=l;i<=r;i++){
            if(i%k==0) {
                ls.add(i);
                continue ;
            }
            boolean tag = false ;
            String xs = String.valueOf(i) ;
            for (int j = 0; j <= xs.length() - p; j++) {
                if (xs.substring(j, j + p).equals(ks)) {
                    tag = true;
                    break;
                }
            }
            if(tag) ls.add(i) ;
        }
        for(int x : ls){
            System.out.print(x);
        }
    }
}


c++

#include<bits/stdc++.h>
using namespace std ;
int main(){
	int k , l , r ;
	cin >> k >> l >> r ;
	string ks = to_string(k) ;
	int p = ks.size() ;
	vector<int> ans ;
	for(int i=l;i<=r;i++){
		if(i%k==0) {
			ans.push_back(i) ;
			continue ;
		}
		bool tag = false ;
		int x = i ;
		string xs = to_string(x) ;
		for(int j=0;j<xs.size()-p+1;j++){
			if(xs.substr(j,p)==ks){
				tag = true ;
				break ;
			}
		}
		if(tag) ans.push_back(i) ;
	}
	for(int x : ans) cout << x << " " ;
}

2.固定词与移位

给你一个长为n的字符串,q次操作 :

  • op=1 , idx : 将idx位置的字符固定
  • op=2 ,将除了固定字符的其它字符全部向后移动一位(遇到固定字符需要移到下一位),最后一位的下一位是第一位;

求处q次操作之后的字符串 :

tets case :

/*
6 4
abcdef
1 2
1 4
2
2
 */

用一个hash表记录固定的下标,op=2时,模拟移动即可 ;

java :

import java.util.HashSet;
import java.util.Scanner;

public class t2 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in) ;
        int n = sc.nextInt() , q = sc.nextInt() ;
        String str = sc.next() ;
        char[] s = str.toCharArray() , s1 = str.toCharArray() ;
        HashSet<Integer> st = new HashSet<>() ;
        for(int k=0;k<q;k++){
            int op = sc.nextInt() ;
            if(op==1){
                int idx =sc.nextInt() - 1 ;
                st.add(idx) ;
            }else{
                for(int i=0;i<n;i++){
                    if(!st.contains(i)){
                        // 进行移动
                        boolean tag = false ;
                        for(int j=i+1;j<n;j++){
                            if(!st.contains(j)){
                                s1[j] = s[i] ;
                                tag = true ;
                                break ;
                            }
                        }
                        if(!tag){
                            for(int j=0;j<n;j++){
                                if(!st.contains(j)){
                                    s1[j] = s[i] ;
                                    break ;
                                }
                            }
                        }
                    }
                }
                for(int i=0;i<n;i++) s[i] = s1[i] ;
            }
        }
        for(char c : s){
            System.out.print(c);
        }
    }
}


c++ :

#include<bits/stdc++.h>
using namespace std ;
int main(){
	int n , q ; cin >> n >> q ;
	string s ; cin >> s ;
	string s1 = s ;
	set<int> st ;
	while(q--){
		int op ; cin >> op ;
		if(op==1){
			int x ; cin >> x ;
			st.insert(x-1) ;
		}else{
			for(int i=0;i<n;i++){
				if(!st.count(i)){
					// 需要移动
					bool tag = false ;
					for(int j=i+1;j<n;j++){
						if(!st.count(j)){
							tag = true ;
							s1[j] = s[i] ;
							break ;
						}
					}
					if(!tag){
						for(int j=0;j<n;j++){
							if(!st.count(j)){
								s1[j] = s[i] ;
								break ;
							}
						}
					} 
				}
			}
			for(int i=0;i<n;i++) s[i] = s1[i] ;
		}
	}
	for(int i=0;i<n;i++) cout << s[i] ;
	return 0 ;
}

3.坐车

// n个点,m表示最大值
// a[i][j] 表示(i,j)之间的距离  ,为-1表示两点之间不相邻
// 求对于每一个点,从该点出发经过x点之后回到原点(x->[1,m])的最小花费是什么? 

不会,暴力拿了0.2;

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


const int N = 210 ;
int a[N][N] ;
#define int long long
const int INF = 1e18 ;

// n个点,m表示最大值
// a[i][j] 表示(i,j)之间的距离  ,为-1表示两点之间不相邻
// 求对于每一个点,从该点出发经过x点之后回到原点(x->[1,m])的最小花费是什么? 

int dp[N][N] ;

int ans = INF , p = -1 ;

vector<int> e[N] ;

void dfs(int sum , int i ,int k){
	if(i==p&&k==0){
		ans = min(ans,sum) ;
		return ;
	}
	if(k<0) return ;
	for(int j : e[i]){
		dfs(sum+a[i][j],j,k-1) ;
	}
	
}

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) ;
	int n , m ; cin >> n >> m ;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin >> a[i][j] ;
			if(a[i][j]!=-1) e[i].push_back(j) ;
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){// 经过j分钟 
			if(j==1) {
				dp[i][j] = -1 ;
				continue ;
			}
			ans = INF ;
			p = i ;
			dfs(0,i,j) ;// sum , 当前下标 , 还剩次数 
			if(ans!=INF) dp[i][j] = ans ;
			else dp[i][j] = -1 ;
		} 
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
			cout << dp[i][j] << " " ;
		cout << endl ;
	}
}

期望面试!!!

#你都收到了哪些公司的感谢信?##牛客创作赏金赛##软件开发笔面经#
秋招joker 文章被收录于专栏

记录秋招...

全部评论
2.2道?
点赞 回复 分享
发布于 10-11 21:16 广东

相关推荐

不愿透露姓名的神秘牛友
昨天 19:22
点赞 评论 收藏
分享
3 4 评论
分享
牛客网
牛客企业服务