首页 > 代码库 > 腾讯2017暑期实习生编程题

腾讯2017暑期实习生编程题

腾讯2017暑期实习生编程题

题目来源:https://www.nowcoder.com/questionTerminal/28c1dc06bc9b4afd957b01acdf046e69

1.构造回文

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。

输入例子:
abcda
google
输出例子:

2

2

 1 #include <iostream>
 2 #include"math.h"
 3 #include<string>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN = 1010;
 7 int dp[MAXN][MAXN];
 8 class Solution
 9 {
10 public:
11     int solve(string &s)
12     {
13         return s.length() - getLCS(s);
14     }
15 
16     int getLCS(string &s1)
17     {
18         string s2(s1);
19         reverse(s2.begin(), s2.end());
20         int len = s1.length();
21         memset(dp, 0, sizeof dp);
22         for (int i = 0; i<len; ++i)
23         {
24             for (int j = 0; j<len; ++j)
25             {
26                 if (s1[i] == s2[j])
27                     dp[i + 1][j + 1] = dp[i][j] + 1;
28                 else dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
29             }
30         }
31         return dp[len][len];
32     }
33 };
34 int main()
35 {
36     string s;
37     while (cin >> s)
38     {
39         Solution solution;
40         cout << solution.solve(s) << endl;
41     }
42     return 0;
43 }

2.字符移位

小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 你能帮帮小Q吗?

 

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出移位后的字符串。

输入例子:
AkleBiCeilD
输出例子:
kleieilABCD
 1 #include<iostream>  
 2 #include<string>
 3 using namespace std;
 4 int main()
 5 {
 6     string str1;
 7     while (cin >> str1)
 8     {
 9         int i = str1.length();//指向末尾的指针  
10         int j = i - 1;//指向前一个  
11         while (j >= 0)
12         {
13             if (isupper(str1[j]))//如果是大写字母 
14             {
15                  char temp = str1[j];
16                  int t = j;
17                  i--;
18                  while (t < i)//将j-i间的小写字母前移  
19                  {
20                       str1[t] = str1[t + 1];
21                       t++;
22                  }
23                  str1[i] = temp;
24               }
25               j--;
26         }
27         cout << str1 << endl;
28     }
29     return 0;
30 }

3.有趣的数字

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

 

输入描述:

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

输出描述:

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

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

1 2

思路:

1.先排序
   特殊情况:如果排完序之后发现数组中所有数都相同,直接输出结果
   结果为:差最大个数 = 差最小个数 = (n * (n-1))/2;(两两组合)
2.统计数组中每种数字的个数(这里用的map)
3.计算差最小个数
   3.1.如果数组中没有重复数字,说明最小差不为0,最小差肯定是数组中相邻两个数的差
       因此,遍历一边数组,计算并统计最小差。
   3.2.如果数组中有重复数字,说明最小差是0,此时,遍历一边map,数字个数不为0
       数字会产生最小差0,利用公式计算即可
4.计算差最大个数
  只有一种情况,最大值与最小值的两两组合,即最大值个数 * 最小值个数
 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <map>
 5 #include <algorithm>
 6 
 7 using namespace  std;
 8 
 9 int main()
10 {
11     int n;
12     while (cin >> n)
13     {
14         int i, beg, s1 = 0, cha, num;
15         map<int, int>vec;
16         for (i = 0; i < n; ++i)
17         {
18             cin >> num;
19             vec[num]++;
20         }
21         map<int, int>::iterator it = vec.begin(), jt = vec.end();
22         for (; it != vec.end(); ++it)
23         {
24             if (it->second > 1)
25                 s1 = s1 + (it->second - 1) * it->second / 2;
26         }
27         if (s1 == 0)
28         {
29             it = vec.begin();
30             beg = it->first;
31             it++;
32             cha = it->first - beg;
33             for (; it != vec.end(); ++it)
34             {
35                 if (cha > it->first - beg)
36                 {
37                     cha = it->first - beg;
38                     s1 = 1;
39                 }
40                 else if (cha == it->first - beg)
41                     s1++;
42                 beg = it->first;
43             }
44         }
45         it = vec.begin();
46         jt--;
47         if (it->first != jt->first)
48             cout << s1 <<   << it->second * jt->second << endl;
49         else
50             cout << it->second - 1 <<   << it->second - 1 << endl;
51     }
52     return 0;
53 }

 

腾讯2017暑期实习生编程题