解题思路
这是一道字符串处理题目,主要思路如下:
-
对于每个输入的单词:
- 如果长度小于10,直接输出原单词
- 如果长度大于等于10,进行缩写处理:
- 保留首字母
- 中间替换为字符个数(去掉首尾后的长度)
- 保留尾字母
-
缩写规则示例:
- "localization" (12字符) -> "l10n"
- "internationalization" (20字符) -> "i18n"
- "word" (4字符) -> "word" (保持不变)
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int T;
cin >> T;
while(T--) {
string s;
cin >> s;
// 获取字符串长度
int len = s.length();
// 长度大于等于10时进行缩写
if(len >= 10) {
string result = "";
result += s[0]; // 首字母
result += to_string(len - 2); // 中间字符数
result += s[len - 1]; // 尾字母
s = result;
}
cout << s << endl;
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while(T-- > 0) {
String s = sc.next();
int len = s.length();
// 长度大于等于10时进行缩写
if(len >= 10) {
StringBuilder result = new StringBuilder();
result.append(s.charAt(0)); // 首字母
result.append(len - 2); // 中间字符数
result.append(s.charAt(len - 1)); // 尾字母
s = result.toString();
}
System.out.println(s);
}
}
}
def abbreviate_word(word):
# 获取字符串长度
length = len(word)
# 长度大于等于10时进行缩写
if length >= 10:
# 构造缩写:首字母 + 中间字符数 + 尾字母
return word[0] + str(length - 2) + word[-1]
return word
def main():
# 读取测试用例数量
T = int(input())
# 处理每个测试用例
for _ in range(T):
word = input()
print(abbreviate_word(word))
if __name__ == "__main__":
main()
算法及复杂度
- 算法:字符串处理
- 时间复杂度:
- 其中
为测试用例数量,每个单词的处理时间为
- 空间复杂度:
- 只需要常数级别的额外空间
注意事项
- 只有长度大于等于10的单词需要缩写
- 缩写后的格式为:首字母 + 中间字符数 + 尾字母
- 中间字符数需要转换为字符串
- 原长度小于10的单词保持不变