有关编程(HDU)练习时候遇到的基础字符串问题—菜菜子的卑微记录
一、字符串的输入以及遇见空格的反转问题
hdu1062
错误代码:
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
char a[1005];
int main() {
int t;
cin >> t;
while (t--) {
getchar();
//以每一个空格为分界点进行倒着输出
while (cin >> a) {
if (a[0] == '\n')break;
int i = strlen(a) - 1;
for (; i >= 0; i--)cout << a[i];
cout << " ";
}
cout << endl;
}
return 0;
}
因为好久不练啊哈哈(/(ㄒoㄒ)/~~),果然基本的输入输出要点都忘得差不多了——菜鸟本菜~
正确解法(遇到空格反转,记得保存之前的位置)
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
char a[1005];
int main() {
int t;
cin >> t;
getchar();
while (t--) {
//以每一个空格为分界点进行倒着输出
cin.getline(a, 1005);//首先我们得到了一串字符串
int len = strlen(a);//然后我们需要根据空格进行单词的保存与逆序输出
int pre=0, next;
for (int i = 0; i <= len - 1; i++) {
//测试
//cout << "a[0]=" << a[0] << endl;
if (a[i] == ' ') {
next = i - 1;
/*if (next== pre) {
cout << a[pre] << " ";
continue;
}*/
for (int j = next; j >= pre; j--)
cout << a[j];
cout << " ";
pre = i + 1;
}
/*if (i == len - 1) {
next = i;
for (int j = next; j >= pre; j--)
cout << a[j];
cout << " ";
}*/
}
for (int j = len - 1; j >= pre; j--) {
cout << a[j];
}
cout << endl;
}
return 0;
}
就是昂不要抱着侥幸心理啦之前偷懒了一下结果一直是PE就很难顶~
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
char a[105];
int sum[7];
int main() {
int n;
cin >> n;
getchar();
while (n--) {
cin.getline(a, 105);//读取一行字符串
memset(sum, 0, sizeof(sum));
for (int i = 0; i < strlen(a); i++) {
if (a[i] == 'a')sum[0]++;
if (a[i] == 'e')sum[1]++;
if (a[i] == 'i')sum[2]++;
if (a[i] == 'o')sum[3]++;
if (a[i] == 'u')sum[4]++;
}
cout << "a:" << sum[0] << "\n";
cout << "e:" << sum[1] << "\n";
cout << "i:" << sum[2] << "\n";
cout << "o:" << sum[3] << "\n";
cout << "u:" << sum[4]<<"\n";
if (n)cout << endl;
}
}
这题是真的基础,对比上面一题主要复习了getchar()吃换行符号的知识点以及巩固了cin.getline(,) 的使用格式问题,啊哈哈~
hdu2043
字符串的题目:一开始我还以为特殊字符是ASCII码表里全部特殊字符(大写的愚蠢机灵鬼儿 .jpg),然后……嗷嗷啊,读题很重要呀,这种机考送分题错了太可惜5555~
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
char sec[100];
bool is_safe(char a[]) {
int n = strlen(a);
if (n > 16 || n < 8)return false;
bool isA = false, isa = false, isT = false,isnum=false;
//~,!,@,#,$,%,^
for (int i = 0; i < n; i++) {
if (a[i] <= 'z' && a[i] >= 'a')isa = true;
if (a[i] <= 'Z' && a[i] >= 'A')isA = true;
if (a[i] <= '9' && a[i] >= '0')isnum = true;
if (a[i]=='~'||a[i]=='!'||a[i]=='@'||a[i]=='#'||a[i]=='$'||a[i]=='%'||a[i]=='^')isT = true;
}
int nn = 0;
if (isA)nn++;
if (isa)nn++;
if (isT)nn++;
if (isnum)nn++;
if (nn >= 3)return true;
return false;
}
int main() {
int n;
cin >> n;
getchar();
while (n--) {
cin.getline(sec, 100);
if (is_safe(sec))cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
遇到空格自动保存数据
没有采用先进的语言或者头函数(毕竟一些语言我还不懂,尴尬~)
稍微复习了一下cin.getline(字符串名,长度<可以设置大一点防止不够用>)
wa的原因很无语,自己忘记删干净掉找bug用的语句了
下面是ac的代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
int num[100008];
char b[100000];
int main() {
int n;
while (cin >> n) {
int total = 0;
getchar();
while (n--) {
cin.getline(b, 10000);
int flag = false;
int anum=-1;
for (int i = 0; i < strlen(b); i++) {
if (b[i] <= '9' && b[i] >= '0') {
if (flag == false) {
flag = true;
anum = b[i] - '0';
}
else if (flag == true) {
anum *= 10;
anum += (b[i] - '0');
}
}
else if(flag){
num[total] = anum;
anum = -1;
total++;
flag = false;
}
}
if (anum >= 0) {
num[total] = anum;
total++;
}
}
sort(num, num + total);
int duan=-1, chong=-1;
/*for (int i = 0; i < total ; i++) {
cout << "num[" << i << "]:" << num[i] << " ";
}
cout << endl;*/
for (int i = 0; i < total-1; i++) {
if (num[i + 1] - num[i] == 0)chong = num[i];
if (num[i + 1] - num[i] == 2)duan = num[i]+1;
}
cout << duan << " " << chong << endl;
}
return 0;
}