删除字符串中出现次数最少的字符
思路:计数排序法;针对于多组测试数据数组初始化,这点要注意不能直接使用 a [26] = { 0 };
写复杂了反而测试用例通不过,笨点按步骤循环吧
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i, len ,min;
int a[26]; //都是小写字母
string s,temp;
while (cin >> s)
{
for (int i = 0; i < 26; i++) //初始化,针对与多个测试输入
a[i] = 0;
len = s.size();
min = a[s[0]-'a']; //哨点
for (i = 0; i<len; i++)
a[s[i]-'a']++;
for (i = 0; i<len; i++)
if (a[s[i]-'a'] <= min)
min = a[s[i]-'a'];
for (i = 0; i < len; i++)
if (a[s[i] - 'a'] > min)
cout << s[i];
cout << endl;
}
return 0;
}
python中需要注意对输入aa
,输出‘ ’
情况的考虑,使用defaultdict
这里注意defaultdict
接受的工厂函数不是str
而是int
,因为字符串是被单个处理的
from collections import defaultdict
while True:
try:
a = input()
b = defaultdict(int)
for i in a:
b[i]+= 1
for i in dd:
if b[i] == min(b.values()):
a = a.replace(i, "")
print(a)
except:
break
按字节截取字符串
string
本身就会判断最后一个字节是否为多余的半个汉字,是的话不输出该字节。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int n;
while (cin >> s >> n)
{
cout << s.substr(0, n) << endl;
}
return 0;
}
这道题如果抛开string
的这个特性从汉字本身来考虑的话
思路:汉字占2B,每个字节的ASCII码最高位均为1,由于char默认为带符号类型,所以汉字的ASCII码为负,而英文数字等其他字符占一个字节,ASCII码最高位为0,值在0~127之间。
结论:判断该字节是否小于0→半个汉字,如果是,则输出总字节-1个字符
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int n;
while (cin >> str >> n)
{
if (str[n-1] < 0)
n--;
cout << str.substr(0, n) << endl;
}
return 0;
}
python写的时候踩了两个坑,一个是python汉字编码为3B,另一个是输入格式例子给出的描述是两行,实际是一行空格隔开
算法思想:遍历判断是否为汉字(转换为unicode
编码进行判断),字符串长度为终止结束条件
try:
while True:
s,n = input().split()
n = int(n)
flag = 0
for i in s:
if '\u4e00' <= i <= '\u9fff':
if n >= 3:
flag += 1
n -= 3
else:
n = 0
else:
flag += 1
n -= 1
if n <= 0:
break
print(s[:flag])
except Exception:
pass
找出字符串中第一个只出现一次的字符
算法思路:计数排序法统计词频,遍历得出最小值,中规中矩
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
{
int a[128]={0};
bool flag=false;
for(int i=0;i<s.size();++i)
++a[s[i]];
for(int i=0;i<s.size();++i)
if(a[s[i]]==1){
cout<<s[i]<<endl;
flag=true;
break;
}
if(flag==false)
cout<<"-1"<<endl;
}
return 0;
}
看了网上有个大神写的代码,很佩服
#include <iostream>
#include <string>
int main()
{
using namespace std;
string str;
while(getline(cin,str))
{
unsigned int i;
for (i=0;i<str.size();i++)
{
if(str.find(str[i])==str.rfind(str[i])) //只出现一次的字符
{
cout<<str[i]<<endl;
break;
}
}
if(i==str.size())
cout<<-1;
}
return 0;
}
喜闻乐见的python,人生苦短,我用python,没啥难度,字符串计数打印完事
while True:
try:
s = str(input())
for i in s:
if s.count(i)==1:
print(i)
break
else:
print(-1)
except:
break