题目一:
给定一个字符串,里边的单词有空格和字符串分隔,对于逗号分隔的后一位首字母改成大写,其余全部小写。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin, str);
if (str[0] >= 'A' && str[0] <= 'Z') {
str[0] = str[0] + 32;
}
for (int i = 1; i < str.size(); i++) {
if (str[i - 1] == ',') {
if(str[i] >= 'a' && str[i] <= 'z')
str[i] = str[i] - 32;
}
else {
if(str[i] >= 'a' && str[i] <= 'z')
str[i] = str[i] + 32;
}
}
for (int i = 0; i < str.size(); i++)
cout << str[i];
cout << endl;
return 0;
}
题目二:
判断一个字符串数组里面有没有包含一个字符串,包含的话输出位置,不包含的话输出-1。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int is_string(string str1, string str2) {
int index = -2;
for (int i = 0; i < str1.size() - str2.size() + 1; i++) {
int count = 0;
for (int j = i; j < str2.size() + i; j++) {
if(str1[j] == str2[count]){
count++;
}
}
if (count == str2.size()) {
index = i; //index等于数组下标位置
break;
}
}
return index + 1; //实际位置等于下标位置加1
}
int main() {
string str1, str2;
cin >> str1 >> str2;
cout << "index: " << is_string(str1, str2) << endl;
return 0;
}
题目三:
求字符串的最长回文串。求每一个子串时间复杂度O(N^2), 判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N3)。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
string LongestString(string str) {
int maxlength = 1; //最长回文字符串长度
int start = 0; //最长回文字符串起始地址
for (int i = 0; i < str.size(); i++) { //子串开始地址
for (int j = i + 1; j < str.size(); j++) { //子串结束地址
int left = i, right = j;
while (left < right && str[left] == str[right]) { //判断是不是回文
left++;
right--;
}
if (left >= right && j - i + 1 > maxlength) { //j - i + 1为该当前回文串的长度
maxlength = j - i + 1;
start = i;
}
}
}
return str.substr(start, maxlength);
}
int main()
{
string str;
cout << "Input source string: " << endl;
cin >> str;
cout << "The longest palindrome: " << endl;
cout << LongestString(str) << endl;
return 0;
}
题目四:
去掉字符串中的重复字符。
思路:如果不允许再开一个数组,只能用额外的一到两个变量。那么,你可以依次访问这个数组的每个元素,每访问一个,就将该元素到字符串结尾的元素中相同的元素去掉(比如置为’ '),时间复杂度为O(n^2)。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
string removeDuplicate(string s)
{
int len = s.length();
if (len < 2)
return s;
string str = "";
for (int i = 0; i<len; ++i)
{
if (s[i] != ' ')
{
str += s[i];
for (int j = i + 1; j<len; ++j)
{
if (s[j] == s[i])
{
s[j] = ' ';
}
}
}
}
return str;
}
int main()
{
string str;
cin >> str;
cout << removeDuplicate(str) << endl;
return 0;
}
题目四:
输入两个二进制字符串,输出其二进制和。
核心代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
//网上的
string addBinary(string a, string b) {
int m = a.size() - 1;
int n = b.size() - 1;
int flag = 0;
string c = "";
int tmp1, tmp2;
while (m >= 0 || n >= 0)
{
if (m<0)
tmp1 = 0;
else
tmp1 = a[m--] - '0';
if (n<0)
tmp2 = 0;
else
tmp2 = b[n--] - '0';
c = char((tmp1 + tmp2 + flag) % 2 + '0') + c;
if ((tmp1 + tmp2 + flag) >= 2)
flag = 1;
else
flag = 0;
}
if (flag)
c = char(flag + '0') + c;
return c;
}
int main() {
string str1, str2;
cin >> str1 >> str2;
cout << addBinary(str1, str2) << endl;
return 0;
}