第一题:
找出输入字符串中的重复字符,在根据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());
}