腾讯2017暑期实习生编程

Posted njczy2010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腾讯2017暑期实习生编程相关的知识,希望对你有一定的参考价值。

传送门

第一题不说了,区间dp

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<string>
 4 #include<cstring>
 5  
 6 using namespace std;
 7  
 8 #define N 1005
 9  
10 int dp[N][N];
11 char s[N];
12 int le;
13  
14 int dfs(int l,int r)
15 {
16     if(dp[l][r] != -1) return dp[l][r];
17     if(l == r) return dp[l][r] = 1;
18     if(l + 1 == r){
19         if(s[l] == s[r] ) return 2;
20         else return 1;
21     }
22     if(l > r) return 0;
23     if(s[l] == s[r]) return dp[l][r] = dfs(l + 1,r - 1) + 2;
24     dp[l][r] = max( dfs(l + 1,r),dfs(l,r - 1) );
25     return dp[l][r];
26 }
27  
28 int main()
29 {
30     while(scanf("%s",s)!=EOF)
31     {
32         le = strlen(s);
33         memset(dp,-1,sizeof(dp));
34         dfs(0,le - 1);
35         printf("%d\\n",le - dp[0][le - 1]);
36     }
37     return 0;
38 }
View Code

 

 

第二题:

http://www.nowcoder.com/profile/495736/test/3572151/44803#summary

 

 

我是倒着把大写字母移到最后的,不过看讨论有更好的方案:

1.直接输出

2.正常从头开始,遇到大写字母就把后面所有的数往前挪一位。

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<string>
 4 #include<cstring>
 5  
 6 using namespace std;
 7  
 8 #define N 1005
 9  
10 char s[N];
11 int le;
12  
13  
14 int main()
15 {
16     while(scanf("%s",s)!=EOF)
17     {
18         le = strlen(s);
19         int i,j;
20         for(i = le - 1;i >= 0;i--){
21             if(s[i] >= \'A\' && s[i] <= \'Z\'){
22                 for(j = i + 1;j < le;j++){
23                     if(s[j] >= \'A\' && s[j] <= \'Z\'){
24                         break;
25                     }
26                     swap(s[j],s[j-1]);
27                 }
28             }
29         }
30         printf("%s\\n",s);
31     }
32     return 0;
33 }
View Code

 

 

 

第三题:

排序 + 处理

当时脑子不知道怎么想的,竟然没考虑到有数字相同,那么最小值应该为0,,,,

 

[编程题]有趣的数字
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

输入描述:

输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.



输出描述:

对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。


输入例子:
6
45 12 45 32 5 6

输出例子:
1 2

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<string>
 4 #include<cstring>
 5 #include<algorithm>
 6 
 7 using namespace std;
 8 
 9 #define N 100005
10 #define ll long long
11 
12 ll a[N];
13 ll n;
14 ll cmi,cma;
15 ll chami;
16 
17 struct PP{
18     ll v;
19     ll c;
20 }B[N],te;
21 
22 int main()
23 {
24     //freopen("in.txt","r",stdin);
25     while(scanf("%lld",&n)!=EOF)
26     {
27         ll i,j;
28         cmi = cma = 0;
29         for(i = 1;i <= n;i++){
30             scanf("%lld",&a[i]);
31         }
32         sort(a + 1, a + 1 + n);
33         ll cl,cr;
34         cl = cr = 1;
35         if(a[1] == a[n]){
36             cmi = cma = n * (n - 1) / 2;
37         }
38         else{
39             for(i = n - 1;i >= 1;i--){
40                 if(a[i] == a[n]) cr++;
41                 else break;
42             }
43             for(i = 2;i <= n;i++){
44                 if(a[i] == a[1]) cl++;
45                 else break;
46             }
47             cma = cl * cr;
48             chami = a[n] - a[1];
49             for(i = 2;i <= n;i++){
50                 chami = min(chami,a[i] - a[i - 1]);
51             }
52             for(i = 1;i <= n;i++){
53                 for(j = i - 1;j >= 1;j--){
54                     if(chami == a[i] - a[j]){
55                         cmi++;
56                     }
57                     else{
58                         break;
59                     }
60                 }
61             }
62         }
63         printf("%lld %lld\\n",cmi,cma);
64     }
65     return 0;
66 }

 

以上是关于腾讯2017暑期实习生编程的主要内容,如果未能解决你的问题,请参考以下文章

腾讯2017暑期实习生编程题

腾讯2017暑期实习生编程题 第一题 构造回文

腾讯2017暑期实习生编程题 第二题 字符移位

腾讯2017年暑期实习生编程题有趣的数字Python

腾讯2017暑期实习编程题3

腾讯2017暑期实习生编程题