字符串的展开

字符串的展开

https://ac.nowcoder.com/acm/problem/16644

WriteUp:

输入

  1. 可以用字符数组,末尾判断根据下一项是否为'/0'来判断。
  2. 用字符串,可以获取到字符串的长度。

输出

  1. 可以用额外的数组标记'-',和其他需要插入的地方,但比较麻烦。
  2. 直接在遍历的时候输出。(较方便)

细节

  1. 字符要用单引号。
  2. 获取字符串长度"s.length()"
#include<bits/stdc++.h>
using namespace std;
const int M = 100000;
string s;
void p(int p1, int p2, int p3, int i) {
	switch(p1) {
		case 1:
			//小写输出
			if(p3 == 1) {
				//顺序输出
				for(int j = (int)(s.at(i-1) + 1); j <= (int)(s.at(i+1) - 1); j++) {
					//输出k个
					for(int k = 1; k <= p2; k++) {
						cout<<(char)(j);
					}
				}
			} else {
				//逆序输出
				for(int j = (int)(s.at(i+1) - 1); j >= (int)(s.at(i-1) + 1); j--) {
					for(int k = 1; k <= p2; k++) {
						cout<<(char)(j);
					}
				}
			}
			break;
		case 2:
			//大写输出
			if(p3 == 1) {
				//顺序输出
				if(s.at(i - 1) >= 'a' && s.at(i - 1) <= 'z') {
					//需要变大写
					for(int j = (int)(s.at(i-1) + 1 - (int)('a' - 'A')); j <= (int)(s.at(i+1) - 1 - (int)('a' - 'A')); j++) {
						//输出k个
						for(int k = 1; k <= p2; k++) {
							cout<<(char)(j);
						}
					}

				} else {
					for(int j = (int)(s.at(i-1) + 1); j <= (int)(s.at(i+1) - 1); j++) {
						for(int k = 1; k <= p2; k++) {
							cout<<(char)(j);
						}
					}

				}
			} else {
				//逆序输出
				if(s.at(i - 1) >= 'a' && s.at(i - 1) <= 'z') {
					//需要变大写
					for(int j = (int)(s.at(i+1) - 1 - (int)('a' - 'A')); j >= (int)(s.at(i-1) + 1 - (int)('a' - 'A')); j--) {
						for(int k = 1; k <= p2; k++) {
							cout<<(char)(j);
						}
					}

				} else {
					for(int j = (int)(s.at(i+1) - 1); j >= (int)(s.at(i-1) + 1); j--) {
						for(int k = 1; k <= p2; k++) {
							cout<<(char)(j);
						}
					}

				}

			}
			break;
		case 3:
			//输出*,顺序和逆序不重要了,重要是p2
			for(int j = (int)(s.at(i-1) + 1); j <= (int)(s.at(i+1) - 1); j++) {
				//输出k个
				for(int k = 1; k <= p2; k++) {
					cout<<'*';
				}
			}
			break;
	}
}
int main() {

	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	cin>>s;
	for(int i = 0; i < s.length(); i++) {
		//'-'在第一个,'-'在最后一个,会越界
		if(s.at(i) == '-' && (i == s.length() - 1 || i == 0)) {
			cout<<'-';
		} else {
			//多个连续'-'
			if(s.at(i) == '-' && (s.at(i-1) >= 'a' && s.at(i-1) <= 'z' || s.at(i-1) >= '0' && s.at(i-1) <= '9') && (s.at(i+1) >= 'a' && s.at(i+1) <= 'z'|| s.at(i+1) >= '0' && s.at(i+1) <= '9') && s.at(i-1) < s.at(i+1)) {
				//只删除-
				if(s.at(i-1) == char(s.at(i+1) - 1)) continue;
				//要替换字符串
				//前者比后者大(做题时缺少该部分)
				if(s.at(i-1) > s.at(i+1)) {
					cout<<'-';
					continue;
				}

				//判断是否同为一种类型
				if((s.at(i-1) >= 'a' && s.at(i-1) <= 'z') && (s.at(i+1) >= 'a' && s.at(i+1) <= 'z')) {
					p(p1,p2,p3,i);
					i++;
				} else if((s.at(i-1) >= '0' && s.at(i-1) <= '9') && (s.at(i+1) >= '0' && s.at(i+1) <= '9')) {
					p(p1,p2,p3,i);
					i++;
				}
			}
			cout<<s.at(i);
		}

	}

}
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务