精华 完美世界实习生招聘3.29在线编程题解
发布于 2017-03-29 21:06 5669 次浏览 3 赞 最后一次编辑是 2017-03-29 21:16 来自 笔试面试  

求职完美世界的同学可以加入完美世界的交流群:560623349,供大家在此交流后续面试及职位信息。


互联网C++

简单弹球游戏:

建立二位坐标系,模拟球的运动,算出坐标

#include <stdio.h>

void ball(int w, int h, int x, int n)
{
    int y = 0;
    int vx = 1, vy = 1;

    while(n > 0) {

        x += vx;
        y += vy;

        if (x >= w || x <= 0) {
            vx = -vx;
        }

        if (y >= h || y <= 0) {
            vy = -vy;
        }

        if (y <= 0) {
            printf("%d ", x);
            --n;
        }
    }

    printf("\n");
}

int main()
{
    int w, h, x, n;
    while(scanf("%d%d%d%d", &w, &h, &x, &n) != EOF) {
        ball(w, h, x, n);
    }
}



时间转换小工具:

按照题意推公式计算

#include <stdio.h>
#include <stdlib.h>

int get_time(int *, int *, int *, int const);
int checkData(int, int, int);

int main(int argc, const char * argv[]) {
    
    int hour, min, second, time_diff_second;
    
    while (scanf("%d:%d:%d,%d", &hour, &min, &second, &time_diff_second) != EOF) {
        
        get_time(&hour, &min, &second, time_diff_second);
        printf("%02d %02d %02d\n", hour, min, second);
    }
    return 0;
}

int checkData(int h, int m, int s)
{
    int ret = 0;
    
    if (h < 0
        || h > 23)
    {
        ret = -1;
    }
    else if (m < 0
             || m > 59)
    {
        ret = -2;
    }
    else if (s < 0
             || s > 59)
    {
        ret = -3;
    }
    
    return ret;
}

int get_time(int *hour, int *min, int *second, int const time_diff_second)
{
    int ret = 0;
    int h = *hour, m = *min, s = *second;
    
    ret = checkData(h, m, s);
    if (ret != 0) {
        return ret;
    }

    int a_min_second = 60;
    int an_hour_second = 60 * a_min_second;
    int a_day_second = 24 * an_hour_second;
    
    int hour_second = h * an_hour_second;
    int min_second = m * a_min_second;
    
    int total_second = hour_second + min_second + s;
    int trans_second = total_second + time_diff_second;

    s = trans_second < 0 ? a_day_second - abs(trans_second % a_day_second) : trans_second;
    
    h = (int)(s / an_hour_second);
    s = s - (h * an_hour_second);
    
    m = (int)(s / a_min_second);
    s = s - (m * a_min_second);

    *hour = h >= 24 ? h % 24 : h;
    *min = m;
    *second = s;
  
    return ret;
}


互联网Java

年会游戏:

典型的背包问题,用动态规划求解

import java.util.Scanner;

public class Main {

	public static void main(String[] args) throws Exception {
		Scanner scanner = new Scanner(System.in);
		int num = scanner.nextInt();
		
		int vale[] = new int[num];
		int weight[] = new int[num];
		for (int i = 0; i < num; i++) {
			
			vale[i] = scanner.nextInt();
		}
		for (int i = 0; i < num; i++) {
			
			weight[i] = scanner.nextInt();
		}
		int totleWight = scanner.nextInt();
		
		System.out.println(knapsack(vale, weight, totleWight));
	}

	public static int knapsack(int val[], int wt[], int W) {
		int N = wt.length;

		int[][] V = new int[N + 1][W + 1];

		for (int col = 0; col <= W; col++) {
			V[0][col] = 0;
		}

		for (int row = 0; row <= N; row++) {
			V[row][0] = 0;
		}

		for (int item = 1; item <= N; item++) {
			for (int weight = 1; weight <= W; weight++) {
				if (wt[item - 1] <= weight) {
					V[item][weight] = Math.max(val[item - 1] + V[item - 1][weight - wt[item - 1]], V[item - 1][weight]);
				} else {
					V[item][weight] = V[item - 1][weight];
				}
			}

		}
		return V[N][W];
	}

}


爸爸去哪儿:

依然是背包问题变形,使用动态规划算法

import java.util.Scanner;
public class Main{
    public static void main(String args[]){
          Scanner reader=new Scanner(System.in);
          int x=reader.nextInt();
		
		  int[] array=new int[x];
		  for(int i=0;i<x;i++){
			array[i]=reader.nextInt(); 
		  }
		  int y=reader.nextInt();
		  System.out.println(minCoins(array,y));
		  
		  
    }
	
	public static int minCoins(int[] arr,int aim){
		if(arr==null||arr.length==0||aim<0){
			return -1;
		}
		int n=arr.length;
		int max=Integer.MAX_VALUE;
		int[][] dp=new int[n][aim+1];
		for(int j=1;j<=aim;j++){
			dp[0][j]=max;
			if(j-arr[0]>=0&&dp[0][j-arr[0]]!=max){
				dp[0][j]=dp[0][j-arr[0]]+1;
			}
		}
		int left=0;
		for(int i=1;i<n;i++){
			for(int j=1;j<=aim;j++){
				left=max;
				if(j-arr[i]>=0&&dp[i][j-arr[i]]!=max){
					left=dp[i][j-arr[i]]+1;
				}
				dp[i][j]=Math.min(left,dp[i-1][j]);
			}
		}
		return dp[n-1][aim]!=max?dp[n-1][aim]:-1;
	}
	
}


游戏C++

破解电报:

本题类似括号匹配检测,读取字符串之后用栈处理。

#include <iostream>
#include <map>
#include <string>
#include <stack>
using namespace std;

bool isValid(string s) {
    stack<char> temp;
    map<char, char> m;   m['&']='@',m['^']='#',m['%']='$';
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '@' || s[i] == '#' || s[i] == '$')
            temp.push(s[i]);
        else if (s[i] == '&' || s[i] == '^' || s[i] == '%')
        {
            if (temp.empty()||temp.top() != m[s[i]]) return false;
            else temp.pop();
        }
    }
    return temp.empty();
}

int main(int argc, char* argv[])
{   
    string temp;
    cin >>temp;
    if(isValid(temp))
        cout << "true" << endl;
    else
        cout << "false" << endl;

    return 0;
}


收集卡片游戏:

把数据读取,排序,去重后输出即可

#include  <iostream> 
#include  <set>
#include  <list>
using namespace std;

int main()
{
        set<int> v1;
        set<int> v2;

        int nID = -1;
        bool bChange = false;
        while (cin>>nID)
        {
                if (nID == 0)
                {
                        if ( !bChange )
                        {
                                bChange = true;
                                continue;
                        }
                        else
                        {
                                break;
                        }
                }
                if (!bChange)
                {
                        v1.insert(nID);
                }
                else
                {
                        v2.insert(nID);
                }
        }

        list<int> v3;

        for (auto it : v1)
        {
                v3.push_back(it);
        }

        for ( auto it : v2)
        {
                if (v1.find(it) == v1.end())
                {
                        v3.push_back(it);
                }
        }

        v3.sort();

        for (auto it : v3)
        {
                cout << it << " ";
        }

    return 0;
}


游戏Java

贪吃鬼小R:

可以直接他每天吃掉的巧克力数量列出递推公式,由此计算出答案

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int day = scanner.nextInt();
            long chocolate = 1;
            int moreEat = 3;
            for (int i = day - 1; i > 0; i--) {
                chocolate = 2 * (chocolate + moreEat);
            }
            System.out.println(chocolate);
        }
    }

}


24点游戏:

暴力枚举4个数之间所有可能的计算,注意除法运算时用浮点数保存结果。

import java.util.LinkedHashMap;
import java.util.Map;

public class Main {
	static Map<Long, Long> rankMap = new LinkedHashMap<>();
	
	 static double wucha = 1E-6; 
	 static double num[] = new double[4];  
	 static boolean flag;  
	
	public static void main(String[] args) {
		java.util.Scanner scanner = new java.util.Scanner(System.in);
		 while(scanner.hasNextInt()) {
			 int a = scanner.nextInt();
			 int b = scanner.nextInt();
			 int c = scanner.nextInt();
			 int d = scanner.nextInt();
			 can24(a, b, c, d);
		 }
	} 
	 public static void game24(int n) {  
	        if (n == 1) {  
	            if (Math.abs(num[0] - 24) <= wucha) {  
	                flag = true;  
	                return;  
	            }  
	        } 
	        
	        if (flag)  
	            return; 
	        
	        for (int i = 0; i < n; i++) {  
	            for (int j = i + 1; j < n; j++) {  
	                double a, b;  
	                a = num[i];  
	                b = num[j];  
	                num[j] = num[n - 1];   
	                num[i] = a + b;  
	                game24(n - 1);  
	                num[i] = a - b;  
	                game24(n - 1);  
	                num[i] = b - a;  
	                game24(n - 1);  
	                num[i] = a * b;  
	                game24(n - 1);  
	                if (b != 0) {  
	                    num[i] = a / b;  
	                    game24(n - 1);  
	                }  
	                if (a != 0) {  
	                    num[i] = b / a;  
	                    game24(n - 1);  
	                }  
	                num[i] = a;  
	                num[j] = b;               
	            }  
	        }  
	    }  
	  
	   public static void can24(int a, int b, int c, int d) {  
	        num[0] = (double) (a);  
	        num[1] = (double) (b);  
	        num[2] = (double) (c);  
	        num[3] = (double) (d);  
	        flag = false;  
	        game24(4);  
	        if (flag)  
	            System.out.print("yes");
	        else  
	        	 System.out.print("no"); 
	    }  
	}


以上思路供同学们参考,也希望同学们分享自己的思路。

求职完美世界的同学可以加入完美世界的交流群:560623349,供大家在此交流后续面试及职位信息。

21 条回复

讲道理 爸爸去哪那道题 给的数据格式是错的

2017-03-29 21:11
3

卡牌游戏那道题,是不是数据错了?比如最后一组数据少了1个0

2017-03-29 21:11
3

#include <stdio.h>

#include <stdlib.h>


void get_time(int *hour, int *min, int *second, int const time_diff_second)

{       

int sum=0;

sum+=*second+time_diff_second+*min*60+*hour*3600;

sum=(sum+24*36000)%(24*3600);

*hour=sum/(3600);

sum=sum%3600;

    *min=sum/60;

    sum=sum%60;

    *second=sum;

    *hour=  (*hour+24)%24;

 

}


int main()

{

int hour, min, second, time_diff_second;


    while (scanf("%d:%d:%d,%d", &hour, &min, &second, &time_diff_second) != EOF) {

        

get_time(&hour, &min, &second, time_diff_second);

printf("%02d %02d %02d\n", hour, min, second);

}

}

//先全部转换成秒

2017-03-29 21:11
1

我也觉得爸爸去哪了那道题验证数据是错的,而且错的那一组,验证数据是-1但其实不是。

2017-03-29 21:12
2

爸爸去哪儿 那道题一直运行错误。。。因为是根据题目给的输入格式写的,结果GG了。。。还是太年轻不会变通。。。

2017-03-29 21:13
1

弹珠游戏没做出来,醉,这坐标转换,没看懂啊

2017-03-29 21:13

那个完全背包也是66666666,呀,标程这个读入能不能给个解释。

有人过了吗?

2017-03-29 21:21
3
coder_CS67H3R3 回复 coder_3EUDS6GW

是的!!好气啊

2017-03-29 21:21

爸爸去哪儿?我去,那格式到底是什么样的?

标程为什么是这样的。。。。

2017-03-29 21:24
1

什么狗屁题解,爸爸去哪儿,出题人是智障,不会出题跑出来坑人?

输入样例

5,2,3

20

你的题解能读取?

什么时候给你输入数组大小了,你是yy答案的嘛?

2017-03-29 21:24
1

我已经膜拜那个出水果背包的人了,你这么吊,怎么不上天呢,实在是66666666。吾等无话可说,我还能表达什么

2017-03-29 21:25
2

最后一道题提交只有20%,心碎

2017-03-29 21:25
1
小码快跑 回复 acmcoderiZLCfvgP

完美的出题GG会哭的

2017-03-29 21:27
acmcoderiZLCfvgP 回复 小码快跑

那请他出来解释清楚,没遇到过还能自己yy数组大小 更改输入格式的oj 他可以上天了

2017-03-29 21:32

能给个原题链接吗


2017-03-29 21:45
小码快跑 回复 魏思政

我们向完美HR申请下吧,如果可以的话,一定尽快放出来

2017-03-29 21:54

弹珠游戏测试样例 65535 65535 0 65535 这代码不超时?

2017-03-29 22:15

收集卡片游戏什么鬼,一直75%

2017-03-30 08:24

本次笔试证明了完美程序员水平也就那样

2017-03-30 08:26

收集卡片那道题 直接一个set不就好了么 set不是自带排序和去重?

2017-03-31 01:56

确实爸爸去哪儿的输入很尴尬。还以为有,分割呢然而日了狗

2017-03-31 11:14
添加回复
回到顶部