去哪儿秋招 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 文章被收录于专栏
记录秋招...

查看15道真题和解析