20188.1華為優招筆試題
阿新 • • 發佈:2019-01-06
第一題:
找出輸入字串中的重複字元,在根據ASCII把重複的字元從小到大排列(字串長度不超過100)
示例:輸入:ABCABCdd 輸出: ABCd
程式碼:
#include<iostream> #include<string> #include<vector> using namespace std; int main() { string str; cin>>str; int len=str.size(); vector<int> v(126); for(int i=0;i<len;i++) { v[(int)(str[i])]++; } for(int j=0;j<126;j++) { if(v[j]>1) cout<<(char)j; } cout<<endl; return 0; }
第二題:
給定一串字元,裡面有些字元有連續出現的特點,請尋找這些連續出現字元中最長的串。如果最長的串有多個,請輸入字元ASCII碼最小的那一串
示例:aaabbbccccccccccccczzzz 輸出:ccccccccccccc
程式碼:
#include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; int main() { vector<int> vec(256, 0); vector<int> vec1(256, 0); string charm; while (cin >> charm) { if (charm.size() == 0) return 0; if (charm.size() == 1) { cout << charm[0]; return 0; } /* for (int i = 0;i<charm.size();i++) { vec[charm[i]] = vec[charm[i]] + 1; }*/ int count = 0; int flag = 0; for (int i = 0;i<charm.size()-1;i++) { count++; if (charm[i] != charm[i + 1]|| flag) { if(vec[charm[i]]<count) vec[charm[i]] = count; count = 0; } } if (charm[charm.size() - 2] == charm[charm.size() - 1]) { count++; if (vec[charm[charm.size() - 2]] < count) { vec[charm[charm.size() - 2]] = count; count = 0; } } if (charm[charm.size() - 2] != charm[charm.size() - 1]) { if (vec[charm[charm.size() - 1]] < 1) { vec[charm[charm.size() - 1]] = 1; } } auto max = max_element(vec.begin(), vec.end()); int index = 0; for (int i = 0;i<256;i++) { if (*max == vec[i]) { index = i; break; } } for (int i = 0;i<*max;i++) { cout << (char)index; } for (int i = 0;i<256;i++) { vec[i] = 0; } cout << endl; int i = 0; } }
根據第一題思路寫出來的程式碼通過率只有87.5,暫未找到原因,下面附上程式碼:
#include<iostream> #include<string> #include<vector> using namespace std; int main() { vector<int> vec(126,0); string s1; cin>>s1; int len=s1.size(); int max=0; int index=0; for(int i=0;i<len;i++) { vec[int(s1[i])]++; } for(int i=0;i<126;i++) { if (vec[i]>max) { max=vec[i]; index=i; } } for(int i=max;i>0;i--) { cout<<(char)index; } }
8.15:
知道問題所在了,加入字串是aaabbbbbbbbbbbbbaaaccccccccaaaaaaaa;
程式碼中把a疊加起來了,這是不對的
第三題:屬於郵局問題(動態規劃)
已知某小鎮的房子沿直線分佈,給定一個有序整型陣列arr,裡面的每個值代表小鎮每棟房子的一維座標點。
現在需要建N個廣告牌,廣告牌只能建在這些座標點上,使得每個座標點離廣告牌的總距離最短,請返回這個最短的總距離。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
using namespace std;
const int INF = ~0U >> 1;
const int N = 305;
int w[N][N];
int dp[N][35];
int a[N];
int n, m;
void Init(int a[], int n)
{
memset(w, 0, sizeof(w));
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
w[i][j] = w[i][j - 1] + a[j] - a[(i + j) >> 1];
}
int Work()
{
for (int i = 1; i <= n; i++)
{
dp[i][i] = 0;
dp[i][1] = w[1][i];
}
for (int j = 2; j <= m; j++)
{
for (int i = j + 1; i <= n; i++)
{
dp[i][j] = INF;
for (int k = j - 1; k<i; k++)
dp[i][j] = min(dp[i][j], dp[k][j - 1] + w[k + 1][i]);
}
}
return dp[n][m];
}
int main()
{
vector<int> arr;
int x;
while (cin >> x)
{
arr.push_back(x);
}
int len = arr.size();
m = arr[len - 1];
n = len - 1;
for (int i = 1; i <= n; i++)
a[i]=arr[i-1];
Init(a, n);
printf("%d\n", Work());
}