騰訊2017暑期實習生編程題

題目一:

給定一個字符串s,你可以從中刪除一些字符,使得剩下的串是一個迴文串。如何刪除才能使得迴文串最長呢?
輸出需要刪除的字符個數。

輸出需要刪除的字符個數。

輸入描述:

輸入數據有多組,每組包含一個字符串s,且保證:1<=s.length<=1000.

輸出描述:

對於每組數據,輸出一個整數,代表最少需要刪除的字符個數。

解題思路:

先reverse求字符串的反串,然後求正反兩字符串的最長公共子序列,要刪除的字符個數就是總長度減去最長公共子序列的長度。

具體實現:

#include<bits/stdc++.h>
using namespace std;
 
int min_deleteNum(string s1){
    int len = s1.length();
    int temp[len+1][len+1];
    string s2(s1);
    reverse(s2.begin(), s2.end());
    memset(temp, 0, sizeof(temp));
    for(int i = 0; i < s1.length(); ++i){
        for(int j = 0; j < s2.length(); ++j){
            if(s1[i] == s2[j]){
                temp[i+1][j+1] = temp[i][j] + 1;
            }else{
                temp[i+1][j+1] = max(temp[i][j+1], temp[i+1][j]);
            }
        }
    }
    return len-temp[len][len];
}
 
int main(){
    string str;
    while(cin >> str){
        cout << min_deleteNum(str) << endl;
    }
    return 0;
}

題目二:

小Q最近遇到了一個難題:把一個字符串的大寫字母放到字符串的後面,各個字符的相對位置不變,且不能申請額外的空間。
你能幫幫小Q嗎?

輸入描述:

輸入數據有多組,每組包含一個字符串s,且保證:1<=s.length<=1000.

輸出描述:

對於每組數據,輸出移位後的字符串。

輸入例子:

AkleBiCeilD

輸出例子:

kleieilABCD

解題思路:

題目要求不能申請額外的空間,所以要在字符串上進行操作,從後向前處理。

用兩個“指針”,一個指針i始終指向已處理過得字串之首(初始位於字符串末尾後面一個位置),另一個指針j前進,當遇到大寫字母時停下進行如下操作:i指針前進1,用temp字符保存下這個大寫字母,然後用循環將j-i之間的小寫字母都前移一位,最後將s[i]置爲保存的大寫字母。

這裏用了判斷是否爲大寫字母的函數:isupper()

具體實現:

#include<iostream>
#include<string>
using namespace std;
 
int main(){
	string s;
	while (cin >> s){
		int i = s.length() ;
		int j = i -1;
		while (j >= 0){
			if (isupper(s[j])){
				char temp = s[j];
				int t = j;
				i--;
				while (t < i){//將j-i間的小寫字母前移
					s[t] = s[t+1];
					t++;
				}
				s[i] = temp;
			}
			j--;
		}
		cout << s << endl;
	}
	return 0;
}
	



題目三:

小Q今天在上廁所時想到了這個問題:有n個數,兩兩組成二元組,相差最小的有多少對呢?相差最大呢?

解題思路:

先將數組排序。

求相差最大的對數:特殊情況是所有數字相等,此時單獨計算; 普通情況就算最大值有多少個相等的,最小值有多少個相等的,然後兩個數相乘;

求相差最小的對數:首先求出最小相差多少。如果爲0,則計算有多少個相等的數字對;如果不爲0,則遍歷數組求出相鄰兩個數有多少對的差等於最小差值。

具體實現:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    while(cin >> n){
        vector<int> array(n);
        for(int i = 0; i < n; i++){ cin >> array[i]; }
        sort(array.begin(), array.end());
        int min_num = 0, max_num = 0;
        //max number
        if(array[0] == array[n-1]){ //如果所有的數字都相等
            max_num = n * (n-1) / 2;
        }else{
            int m1 = 0, m2 = n-1;
            int a = 1, b = 1;
            while(array[m1+1] == array[m1]){
                a++;
                m1++;
            }
            while(array[m2-1] == array[m2]){
                b++;
                m2--;
            }
            max_num = a * b;
        }

        //min number
        int tempMin = array[n-1]- array[0];
        for(int i = 0; i < n - 1; i++){
            if(array[i+1] - array[i] < tempMin){
                tempMin = array[i+1] - array[i];
            }
        }
        if(tempMin != 0){ //如果沒有相等的數
            for(int i = 0; i < n-1; i++){
                if(array[i+1] - array[i] == tempMin){
                    min_num++;
                }
            }
        }else{//有相等的數字
            int i = 0;
            while(i < n-1) {
                int temp = 1;
                int j = i + 1;
                while (array[j] == array[i]) {
                    temp++;
                    j++;
                }
                min_num += temp * (temp - 1) / 2;
                i = j + 1;
            }
        }
        
        cout << max_num << " " << min_num << endl;
    }
    return 0;
}

—————————————————————————————————————————————

加油加油!ヾ(◍°∇°◍)ノ゙編程能力都是練出來的!你也闊以的!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章