判断两个字符串是否互为变形词
题目
给定两个字符串s1和s2,如果s1和s2中出现的字符种类一样且每种字符出现的次数也一样,那么s1和s2互为变形词。请事先函数判断两个字符串是否互为变形此。
代码
用一哈希表来进行记录各词出现概率即可
#include<iostream>
#include<string>
using namespace std;
bool isDeformation(string s1, string s2)
{
if (s1.size() < 1 || s2.size() < 1 || s1.size() != s2.size())
return false;
int len1 = s1.size();
int len2 = s2.size();
int *table = new int[256]; //int* table = new int[len]申请字符个数长度的表是不行的
for (int i = 0; i < 256; i++)
table[i] = 0;
for (int i = 0; i < len1; i++)
table[s1[i]]++;
for (int i = 0; i < len2; i++)
{
if (table[s2[i]]-- < 0)
return false;
}
return true;
}
int main()
{
string str1, str2;
getline(cin, str1);
getline(cin, str2);
bool res = isDeformation(str1, str2);
if (res)
cout << "Right!" << endl;
else
cout << "Wrong!" << endl;
getchar();
return 0;
}
字符串中数字子串的求和
题目
给定一个字符串str,求其中全部数字串所代表的数字之和
要求:忽略小数点字符,例如A1.3,其中包含两个数字1和3;
如果紧贴数字子串的左侧出现字符‘-’,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数时,则数字视为正。
代码
#include<iostream>
#include<string>
using namespace std;
int sum(string s)
{
if (s.size() < 1)
return 0;
int sum = 0;
int len = s.size(); //需要多设置几个变量
int num = 0;
bool pos = true;
int cur = 0;
for (int i = 0; i < len; i++)
{
cur = s[i] - '0';
if (cur < 0 || cur > 9)
{
sum += num;
num = 0;
if (s[i] == '-')
{
if (i - 1 > -1 && s[i] == '-')
pos = !pos;
else
pos = false;
}
else
pos = true;
}
else
num = num * 10 + (pos ? cur : -cur);
}
sum += num;
return sum;
//主要的问题是在符号转换的位置稍微复杂,自己一下子无法得到正确的转换方式
}
int main()
{
string s;
getline(cin, s);
int res = sum(s);
cout << res << endl;
getchar();
return 0;
}
去掉字符串中连续出现k个0的子串
题目
给定一个字符串str和一个整数k,如果str中正好有连续的k个‘0’字符出现是,把k个连续的‘0’字符去除,返回处理后的字符串。
代码
#include<iostream>
#include<string>
using namespace std;
string removeKZeros(string &s, int k)
{
if (s.size() < 1)
return "";
int len = s.size();
string copyS = s;
int count = 0;
int start = -1;
int numKzero = 0;
for (int i = 0; i < len; i++)
{
if (s[i] == '0')
{
count++;
start = start == -1 ? i : start;
}
else
{
if (count == k)
{
/*while (count-- != 0)
s[start++] = 0;*/
copyS.erase(start - numKzero * k, k);
numKzero++;
}
start = -1;
count = 0;
}
}
if (count == k)
{
/*while (count-- != 0)
s[start++] = 0;*/
copyS.erase(start - numKzero * k, k);
}
return copyS;
}
int main()
{
string s;
getline(cin, s);
int k;
cin >> k;
string res = removeKZeros(s, k);
cout << res << endl;
getchar();
return 0;
}
/*有个问题就是如果按照java的格式来设置,原来的字符'0'删除之后空下的位置会变空,但是位置依旧在,所以做了简单的修改*/
判断两个字符串是否互为旋转词
题目
如果一个字符串str,把字符串str前面任意的部分挪到后面形成的字符串叫做str的旋转词。如果str=“12345”,那么“12345”,“23451”,“34512”,“45123”和“51234”为str的旋转词。给定两个字符串a和b,请判断a和b是否互为旋转词。
要求:如果a和b的长度不一样,那么a和b必然不互为旋转词,可以直接返回false。当a和b长度一样,都为N时,要求时间复杂度为O(N).
代码
#include<iostream>
#include<string>
using namespace std;
//要求时间复杂度为O(N)的解法
int* getNextArray(char* ms, int len)
{
if (len == 1)
return new int[1]{ -1 };
int* next = new int[len];
next[0] = -1;
next[1] = 0;
int pos = 2;
int cn = 0;
while (pos < len)
{
if (ms[pos - 1] == ms[cn])
next[pos++] = ++cn;
else if (cn > 0)
cn = next[cn];
else
next[pos++] = 0;
}
return next;
}
//KMP
int getIndexOf(string s, string m)
{
if (s == "" || m == "" || m.size() < 1 || s.size() < m.size())
return -1;
int lens = s.size();
int lenm = m.size();
char* sc = (char*)malloc(sizeof(char) * lens);
char* mc = (char*)malloc(sizeof(char) * lenm);
memcpy(sc, s.c_str(), sizeof(char) * lens);
memcpy(mc, m.c_str(), sizeof(char) * lenm);
int mi = 0, si = 0;
int* next = getNextArray(mc, lenm);
while (si < lens && mi < lenm)
{
if (sc[si] == mc[mi])
{
si++;
mi++;
}
else if (next[mi] == -1)
si++;
else
mi = next[mi];
}
return mi == lenm ? si - mi : -1;
}//说起来现在KMP还是迷糊的
bool isRotation(string a, string b)
{
if (a.size() < 1 || b.size() < 1 || a.size() != b.size())
return false;
string b2 = b + b;
return getIndexOf(b2, a) != -1;
}
int main()
{
string a, b;
getline(cin, a);
getline(cin, b);
bool res = isRotation(a, b);
if (res)
cout << "String a is a rotation of b." << endl;
else
cout << "String a is not a rotation of b." << endl;
getchar();
return 0;
}
将整数字符串转成整数值
题目
给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str代表的整数值,否则返回0.
代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
bool isValid(string s)
{
if (s[0] != '-' && (s[0] < '0' || s[0] > '9'))
return false;
if (s[0] == '-' && (s.size() == 1 || s[1] == '0'))
return false;
if (s[0] == '0' && s.size() > 1)
return false;
int len = s.size();
for (int i = 1; i < len; i++)
if (s[i] < '0' || s[i] > '9')
return false;
return true;
}
int strToNumCore(char* s, int flag)
{
int num = 0;
while (*s != '\0')
{
if (*s >= '0' && *s <= '9')
{
cur = *s - '0';
if ((num > minq) || (num == minq && cur > minr))
{
num = 0;
break;
}
num = num * 10 + cur;
s++;
}
else
{
num = 0;
break;
}
}
return flag * num;
}
int charToNum(string s)
{
if (!isValid(s))
return 0;
int len = s.size();
char *str = new char[len + 1];
strcpy(str, s.c_str());
int flag = 0;
if (*str != '-')
flag = 1;
else
{
flag = -1;
str++;
}
int res = strToNumCore(str, flag);
return res;
}
int main()
{
string s;
getline(cin, s);
int num = charToNum(s);
cout << num << endl;
getchar();
return 0;
}