精华 携程2018届实习生招聘411在线笔试编程题解
发布于 2017-04-11 21:07 9959 次浏览 4 赞 最后一次编辑是 2017-04-12 11:15 来自 试题交流  

欢迎加入携程2018届实习招聘交流群: 613095828 

转载题解请联系携程及赛码网,版权所有违者必究。


以下为真题练习

编程题汇总链接:

http://exercise.acmcoder.com/online/online_judge_list_all?konwledgeId=173


乘积最大:

http://exercise.acmcoder.com/online/online_judge_ques?ques_id=4402&konwledgeId=173


拼图:

http://exercise.acmcoder.com/online/online_judge_ques?ques_id=3864&konwledgeId=173


股票交易:

http://exercise.acmcoder.com/online/online_judge_ques?ques_id=4403&konwledgeId=173


乘积最大:

尝试不同的拆分方法,dp求解或者找规律

示例代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define maxn 109
using namespace std;
long long dp[maxn][maxn];
int solve(int n){
long long ans = 0;
for(int i = 0; i <= n; i++)
ans = max(ans, dp[n][i]);
return ans;
}
int main(){
int n;
cin >> n;
for(int i = 0; i <= n; i++)
dp[0][i] = 1;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
for(int k = 0 ; k < j; k++)
dp[i][j] = max(dp[i][j], dp[i - j][k] * j);
}
}
cout << solve(n) << endl;
return 0;
}


拼图:

经典问题,广度优先搜索

示例代码:

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;
import java.util.ArrayList;
import java.lang.StringBuilder;

public class Main{
   public static String destNumbers = "123456780";
   public static Set<Integer> set = new HashSet<Integer>();
   public static int[]moveTable = new int[]{12,14,10,13,15,11,5,7,3};

   public static ArrayList<Node> getNextMoveList(Node pNode){

       int position = pNode.numbers.indexOf("0");
       int moveStatus = moveTable[position];
       ArrayList<Node> cNodes = new ArrayList<Node>();


       for(int status=1; status <=8; status=status<<1){
           if((moveStatus & status) > 0){
               char[] charNumbers = pNode.numbers.toCharArray();
               int switchPosition = 0;
               if(status == 1){
                  switchPosition = position - 3;
               } else if(status == 2){
                  switchPosition = position - 1;
               } else if(status == 4){
                  switchPosition = position + 1;
               } else if(status == 8){
                  switchPosition = position + 3;
               }
               charNumbers[position] = charNumbers[switchPosition];
               charNumbers[switchPosition] = '0';
               String s = String.valueOf(charNumbers);
               if(!set.contains(Integer.valueOf(s))){
                   set.add(Integer.valueOf(s));
                   Node n = new Node(pNode, s, charNumbers[position]);
                   cNodes.add(n);
               }
           }
       }
       return cNodes;
   }


   static int getResult(Node node){
       String result = "";
       while(node.parentNode != null){
           result += node.currentNum;
           node = node.parentNode;
       }
       return new StringBuffer(result).reverse().toString().length();
   }

   static int run(String numbers){
if(numbers.equals(destNumbers)){
           return 0;
       }
       ArrayList<Node> numsList = new ArrayList<Node>();
       numsList.add(new Node(null, numbers, ' '));
       while(numsList.size() > 0){
           ArrayList<Node> tmpList = new ArrayList<Node>();

           for(Node pNode : numsList){
               ArrayList<Node> cNodes = getNextMoveList(pNode);

               for(Node cNode : cNodes){
                   if(cNode.numbers.equals(destNumbers)){
                       return getResult(cNode);
                    }
                   tmpList.add(cNode);
               }
           }

           numsList = tmpList;
       }
       return -1;
   }

   public static void main(String[] args) {
       Scanner scan = new Scanner(System.in);
     
       String numbers = new String();
       for(int rows=3; rows>0; rows--){
           for(String n: scan.nextLine().split(" ")){
               numbers += n;
           }
       }

       int res = run(numbers);
     
       System.out.println(String.valueOf(res));
   }
}


class Node {
   public Node(Node parentNode, String numbers, char currentNum){
       this.numbers = numbers;
       this.currentNum = currentNum;
       this.parentNode = parentNode;
   }
   public char currentNum;
   public String numbers;
   public Node parentNode;
}


股票交易:

扫描序列,按照题意判断冷却时间,然后更新答案

示例代码:

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int a[1000006],dp[1000006];
int main(){
int n,k;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&k);

int cur=-1000000000, ans=0;

for(int i=1;i<=n;i++)
{
 dp[i]=max(a[i]+cur, dp[i-1]);
 if(i>=k)
  cur=max(cur, dp[i-k]-a[i]);
 else
  cur=max(cur, -a[i]);
 ans=max(ans, dp[i]);
}
printf("%d\n",ans);
}


欢迎加入携程2018届实习招聘交流群: 613095828 

转载题解请联系携程及赛码网,版权所有违者必究。

36 条回复

每个人的题目竟然不一样?我编程题目特别简单


信息熵


import java.util.*;


public class Main {

public static double Entropy(String str) {  

        double H = .0;  

        int sum = 0;  

        int[] letter = new int[26];//26个字符  

        str = str.toUpperCase(); // 将小写字母转换成大写  

        for (int i = 0; i < str.length(); i++) { // 统计字母个数  

            char c = str.charAt(i);  

            if (c >= 'A' && c <= 'Z') {  

                letter[c - 'A']++;  

                sum++;  

            }  

        }  

        //计算信息熵,将字母出现的频率作为离散概率值  

        for (int i = 0; i < 26; i++) {  

            double p = 1.0 * letter[i] / sum;//单个字母的频率  

            if (p > 0)  

                H += -(p * Math.log(p) / Math.log(2));// H = -∑Pi*log2(Pi)   

        }  

        return H;  

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

while (sc.hasNext()) {

String str = sc.nextLine();

double H = Entropy(str);  

            System.out.printf("%4.2f\n", H); 

System.out.println();

}

}


}


2017-04-11 21:09
1

拼图为什么是广度优先搜索,有木有大大给释义疑下

2017-04-11 21:16

想问下我得下面为什么没过?哪位帮忙看看?

求自然数分解乘积那道

 import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Main {

/* 请完成下面这个函数,实现题目要求的功能 */
/* 当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ */
/****************************** 开始写代码 ******************************/
static int run(int numbers,HashMap<Integer, Integer> runInt) {

int res = 1;
int numX = 0;
int numY = 0;
numX = numbers / 2;
numY = numbers - numX;
while (numX == numY || runInt.containsKey(numX) == true || runInt.containsKey(numY) == true) {
numX++;
numY = numbers - numX;

}

if (numbers > numX * numY) {
return numbers;
} else {
runInt.put(numX, 1);
runInt.put(numY, 1);
return run(numX,runInt) * run(numY,runInt);

}
}

/****************************** 结束写代码 ******************************/

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
HashMap<Integer, Integer> runInt = new HashMap<Integer, Integer>();
int result = run(num,runInt);
System.out.println(result);
}


2017-04-11 21:17

//数据量不大,水过去了

#include <iostream>

#include <string>


#include <cstdio>

#include <cstdlib>

#include <algorithm>



using namespace std;


void maxNumCore(bool *visit, int &max, int count, int tempMul


ti, int n)

{

    if (count == n)

    {

        if (tempMulti > max)

        max = tempMulti;

    }


    for (int i = 1; i < n; ++ i)

    {

        if (!visit[i] && count + i <= n)

        {

            visit[i] = true;


            maxNumCore(visit, max, count + i, tempMulti * i, n);


            visit[i] = false;

        }

    }

}


int maxNum(int n)

{

    bool *visit = new bool[n];

    for (int i = 0; i < n; ++ i)

    {

        visit[i] = false;

    }


    int max = 1;

    int tempMulti = 1;

    int count = 0;


    maxNumCore(visit, max, count, tempMulti, n);


    return max;

}


int main()

{

    int res;

    int n;


    cin >> n;


    res = maxNum(n);

    cout << res << endl;

    return 0;

}


2017-04-11 21:19

感觉股票那一题做的不对啊

2017-04-11 21:20
coder_XXG2KYPJ 回复 coder_HK98C6J8

你这个算法得到的会是具有相同的分解数相乘,题目要求的是不同的整数

2017-04-11 21:20

大家都做对了几道题啊?

2017-04-11 21:21

去除字符串中的标点符号

#include <iostream>

#include <string>

using namespace std;


int main(){

string str;

cin>>str; 

string strDes="";

for(int n=0;n<str.length();n++)

{

char cTemp = str.at(n);

if((cTemp>47&&cTemp<58)||(cTemp>64&&cTemp<91)||(cTemp>96&&cTemp<123))

strDes+=cTemp;


}

if(strDes==str)

{

cout<<"Enter a string:"<<endl;

cout<<"No punctuation character in the string?!"<<endl;

}

else

{

cout<<"Enter a string:"<<endl;

cout<<"Result:"<<endl;

cout<<strDes;

}


}


2017-04-11 21:23

字符串去掉标点符号呢?

2017-04-11 21:23

拉闸拉闸 第二道.

2017-04-11 21:27

有人给个思路详解吗

2017-04-11 21:28

什么时候把题目放出来啊?

2017-04-11 21:31
1

测试开发的编程题有答案吗

2017-04-11 21:35
1
小码快跑 回复 coder_R5DWFCHX

已经更新在最上面

2017-04-11 21:35
coder_E4DMQX9W 回复 coder_WFB6GKB4

这个真的可以么?

2017-04-11 21:36

求放任务分配的在线编程题哈,想测试下。考试的时候没有时间。

2017-04-11 21:37
acmcoderf9AWMSR6 回复 coder_JDYGWNF6

[1,3] [2,6] ans=6

2017-04-11 21:37
coder_W7DME38H 回复 小码快跑

测试开发的编程题怎么没有啊

2017-04-11 21:38
小码快跑 回复 coder_JS9AGMXA

明后天会陆续更新的~

2017-04-11 21:39
小码快跑 回复 coder_W7DME38H

明后天陆续更新

2017-04-11 21:40
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Main {


/*请完成下面这个函数,实现题目要求的功能*/
/*当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ */
/******************************开始写代码******************************/
    static int maxProfit(int[] prices, int k) {
        int n =prices.length-1;
        int ans =0;
        int cur = Integer.MIN_VALUE;
        int[] dp = new int [n+1];
        dp[0] =0;
         boolean  outed =false;
        for(int i=1;i<=n;i++)
        {
            dp[i]=Math.max(prices[i]+cur, dp[i-1]);
            if(i>=k)
                cur=Math.max(cur, dp[i-k]-prices[i]);
            else
                cur=Math.max(cur, -prices[i]);
            ans=Math.max(ans, dp[i]);
        }
      
        return ans;

    }
/******************************结束写代码******************************/


    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int res;
            
        int _stockPrices_size = 0;
        _stockPrices_size = Integer.parseInt(in.nextLine().trim());
        int[] _stockPrices = new int[_stockPrices_size+1];
        int _stockPrices_item;
        for(int _stockPrices_i = 1; _stockPrices_i <= _stockPrices_size; _stockPrices_i++) {
            _stockPrices_item = Integer.parseInt(in.nextLine().trim());
            _stockPrices[_stockPrices_i] = _stockPrices_item;
        }
        
        int _k;
        _k = Integer.parseInt(in.nextLine().trim());
  
        res = maxProfit(_stockPrices, _k);
        System.out.println(String.valueOf(res));    

    }
}


2017-04-11 21:42
acmcoderf9AWMSR6 回复 coder_XXG2KYPJ

bfs 预处理一下, 从123456780的状态开始往外扩展, 记录每个状态距离初始状态的distance就ok了

2017-04-11 21:42

股票交易,如下样例:

8
1 2 3 5 6 2 3 7
2

跑出的答案是9,正确答案应该是8。

问题出在代码

if(i>=k)
   cur=max(cur, dp[i-k]-a[i]);

应该是

if(i>k)
   cur=max(cur, dp[i-k-1]-a[i]);

否则不符合题目规定的隔k天的要求。

2017-04-11 21:48

谁可以详解下拼图那个题?

2017-04-11 21:59
def mutl(ls):
    result = 1
    for item in ls:
        result *= item
    return result

def compute(n, step):
    path = []
    cursum = 0
    for index in range(step, n):
        if cursum > n:
            last = path.pop()
            path.append(path.pop() + n - (cursum - last))
            break
        path.append(index)
        cursum += index
    return mutl(path)

def my(n):
    total = []
    maxvalue = 0
    for step in range(int(n/2)):
        item = compute(n, step)
        total.append(item)
    maxvalue = max(total)
    return maxvalue



n = int(raw_input())
result= my(n)
print(result)


2017-04-11 22:07

第一题,求n分解出的自然数的乘积最大。

def mutl(ls):
    result = 1
    for item in ls:
        result *= item
    return result

def compute(n, step):
    path = []
    cursum = 0
    for index in range(step, n):
        if cursum > n:
            last = path.pop()
            path.append(path.pop() + n - (cursum - last))
            break
        path.append(index)
        cursum += index
    return mutl(path)

def my(n):
    total = []
    maxvalue = 0
    for step in range(int(n/2)):
        item = compute(n, step)
        total.append(item)
    maxvalue = max(total)
    return maxvalue



n = int(raw_input())
result= my(n)
print(result)


2017-04-11 22:09

附加题这个股票,为什么这么简单。。。考试没来得及做。。。好可惜!

int maxProfit(vector < int > stockPrices, int len, int be, int k) 

{

if (len <= 0 || k < 1 || be > len-2)

return 0;

int max = 0;

for (int a = be; a < len-1; a++)

{

for (int b = a+1; b < len; b++)

{

int submax = maxProfit(stockPrices, len, b+k, k);

int m = stockPrices[b] - stockPrices[a] + submax;

if (m > max)

max = m;

}

}

return max;

}


2017-04-11 22:51
2

第一题 谁给说下 dp【i】[j] : ?


2017-04-12 09:09
coder_UQDTVPWQ 回复 coder_TGTSEBJN

我看他的答案的意思是第k天可以买入。但我也觉得隔K天应该是K天无法买入和卖出。可能他题目没有表达清楚。

2017-04-12 15:59

附加题,

没有必要每次判断ans = max(ans, dp[i])

因为 dp[i] = max(a[i]+cur, dp[i-1])

保证了dp[n-1]一定是最大的。

2017-04-12 16:03
coder_ansonwen 回复 coder_9G2KYDSQ

i为要拆分的数,j为拆成多少个数值

2017-04-12 16:53

我能说乘积最大那道题我看了一小时都没懂么,就不能顾及以下学渣的感受稍微加点注释么?

2017-04-14 18:17
2
coder_K25MQADF 回复 coder_ansonwen

j是可拆分的最大值吧,,

2017-04-14 21:35
coder_WFB6GKB4 回复 coder_E4DMQX9W

通过了所有测试用例

2017-04-14 21:59
coder_GD3284BW 回复 coder_TGTSEBJN

我也感觉有问题啊,但是题目给出的例子说明是对的。很奇怪

2017-05-14 21:30

师弟师妹,师兄帮你内推阿里巴巴

师兄微信号: alibabazp

师兄专门为你排忧解难,同时赠送相关学习资料。

内推贴:

https://discuss.acmcoder.com/topic/5d50cb6751f256de05b3dd5a


2019-08-15 19:21
添加回复
回到顶部