【美團點評】2020校招系統開發方向筆試題


還是只寫了編程題。這套題寫了大概一個半小時。。下午剛做完的。

還是有點難。。QAQ我不會字符串是真的/


 

 

試題鏈接:2020校招系統開發方向筆試題

 

7、 大數加法

題意:以字符串的形式讀入兩個數字,再以字符串的形式輸出兩個數字的和。

 

題解:這題我做過!!!之前用java參加藍橋杯的時候學過23333(應該是說自從那次去參加湖北今日頭條杯,場上壓8位精度c++板子被草之后回來就去學了java大數。。。)

java的大整數類的應用,詳情可以看鏈接,里面有很多java的常見用法。

這題的坑點是,它的引號是當作字符輸入的。。!QAQ所以要去除引號。

 

代碼:

 1 import java.util.Scanner;
 2 import java.math.BigInteger;
 3  
 4 public class Main{
 5     public static void main(String[] args) {
 6         Scanner scanner = new Scanner(System.in);
 7         String num1 = scanner.nextLine();
 8         String num2 = scanner.nextLine();
 9         num1 = num1.substring(1,num1.length()-1);
10         num2 = num2.substring(1,num2.length()-1);
11         //初始化
12         BigInteger n1 = new BigInteger(num1);
13         BigInteger n2 = new BigInteger(num2);
14          
15         //System.out.println(n1);
16         //System.out.println(n2);
17         BigInteger sum = n1.add(n2);        //
18  
19         System.out.println("\""+sum+"\"");
20     }
21  
22 }
View Code

 

 

8、 回文子串

題意:給定一個字符串,你的任務是計算這個字符串中有多少個回文子串(回文串是一個正讀和反讀都一樣的字符串)。

具有不同開始位置或結束位置的回文串,即使是由相同的字符組成,也會被計為是不同的子串。

 

題解:這個題就是最長回文子串的變形,我們做一個統計就可以,最長回文子串可以看鏈接。

 

代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1010;
 4 int dp[maxn][maxn] = {0};
 5  
 6 int main(){
 7     string s;
 8     cin>>s;
 9     int len = s.size();
10     int cnt = 0;
11     cnt += len;
12     for(int i = 0; i < len ;i++){
13         dp[i][i] = 1;
14         if(s[i] == s[i+1]){
15             dp[i][i+1] = 1;
16             cnt++;
17         }
18     }
19     for(int pos = 3; pos<=len ; pos++){
20         for(int i = 0 ;i <= len-pos; i++){
21             int j = i+pos-1;
22             if(dp[i+1][j-1] && s[i] == s[j]){
23                 dp[i][j]=1;
24                 cnt++;
25             }
26         }
27     }
28  
29     cout<<cnt<<endl;
30      
31     return 0;
32 }
View Code

 

 

9、合並金幣

題意:有 N 堆金幣排成一排,第 i 堆中有 C[i] 塊金幣。每次合並都會將相鄰的兩堆金幣合並為一堆,成本為這兩堆金幣塊數之和。經過N-1次合並,最終將所有金幣合並為一堆。請找出將金幣合並為一堆的最低成本。

其中,1 <= N <= 30,1 <= C[i] <= 100

 

題解:以前打比賽訓練的時候有做過一道叫做合並石子的題。一道經典的區間dp應用。

其實之前最先做這個題我是用貪心,但是明顯貪心不對。因為這是選擇相鄰的兩堆金幣。

我們用dp[l][r]表示l到r區間合並的最小值。接下來就是划分子問題。

我們將[l,r]區間做一個k的划分,以k為分界點,可以划分成[l,k]和[k+1,r](所以k不能枚舉到r啦)

這樣就能得到狀態轉移方程 dp[l][r] = min(dp[l][r],dp[l][k] + dp[k+1][r] + cost[l][r])

這里的花費就是合並金幣所需要的花費。從[l,r]的花費也就是金幣總個數(做初始化即可)/

(補了一下注釋,雖然也沒啥)這種題目還有很多變種類型,優化也有很多。

 

代碼:

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 105;
 4 
 5 int n;
 6 int num[maxn]={0};
 7 int dp[maxn][maxn]={0};
 8 int cost[maxn][maxn]={0};
 9 
10 int main(){
11     cin>>n;
12     for(int i = 1;i <= n;i++)   cin>>num[i];
13 
14     memset(dp,0x3f,sizeof(dp));
15     
16     //花費初始化
17     for(int i = 1; i <= n;i++){
18         for(int j = i; j <= n ;j++){
19             for(int k = i; k <= j; k++){
20                 cost[i][j] += num[k];
21             }
22         }
23     }
24     
25     for(int i = 1; i <= n ;i++)    dp[i][i] = 0;
26 
27     //枚舉k  [l,r]->[l,k]+[k+1,r]
28     for(int len = 2; len <= n;len++){
29         for(int l = 1; l <= n-len+1 ;l++){
30             int r = l+len-1;
31             for(int k = l ; k < r; k++){
32                 dp[l][r] = min(dp[l][r],dp[l][k] + dp[k+1][r]+cost[l][r]);
33             }
34         }
35     }
36 
37     cout<<dp[1][n]<<endl;
38     return 0;
39 }
View Code

 

 

 

 

10、最小唯一前綴

題意:給定一組個字符串,為每個字符串找出能夠唯一識別該字符串的最小前綴。

 

題解:當時腦子里想到是字典樹,但是不信邪,要去做暴力。。但是暴力的不夠優美。。

於是上了板子3分鍾就AC了。/trie樹真的很好用。。准備多做字符串的題了。。我字符串真的好弱。

 

代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3  
 4 const int maxn = 105;
 5 const int maxnode = 100005;
 6  
 7 string str[maxn];
 8  
 9 int ch[maxn][maxn];
10 char val[maxn];
11  
12 struct Trie {
13     int sz;
14     Trie() {
15         sz = 1;
16         memset(ch[0], 0, sizeof(ch[0]));
17     }
18     int idx(char c) { return c - 'a'; }
19  
20     void insert(string s) {
21         int u = 0;
22         int n = s.size();
23         for(int i = 0; i < n; i++) {
24             int c = idx(s[i]);
25             if(!ch[u][c]) {
26                 memset(ch[sz], 0, sizeof(ch[sz]));
27                 val[sz] = 0;
28                 ch[u][c] = sz++;
29             }
30             u = ch[u][c];
31             val[u]++;
32         }
33     }
34  
35     void query(string s) {
36         int u = 0;
37         int n = s.size();
38         for(int i = 0; i < n; i++) {
39             putchar(s[i]);
40             int c = idx(s[i]);
41             if(val[ch[u][c]] == 1) return ;
42             u = ch[u][c];
43         }
44     }
45 };
46  
47 int main() {
48     Trie trie;
49     int n;
50     cin>>n;
51     for(int i = 0;i < n ;i++){
52         cin>>str[i];
53         trie.insert(str[i]);
54     }
55     for(int i = 0; i < n; i++) {
56         trie.query(str[i]);
57         cout<<endl;
58     }
59     return 0;
60 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM