#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void main()
{
char str[1024];
int num[1024] = {0};
scanf("%s", str);
for (int i = 0; i < strlen(str); i++) //判断是否除了字母以外还有其他字符如果有则删去
{
while (str[i]<'A' || str[i]>'z' )
{
for (int j = i; j < strlen(str); j++)
{
str[j] = str[j + 1];
}
if (str[i] == '\0')
{
break;
}
}
}
int i = 0;
while (str[i]!='\0')
{
int count = 1;
int j = i;
while (str[j] == str[j + 1])
{
count++;
j++;
}
num[i] = count;
printf("%c", str[i]);
printf("%d", num[i]);
i += count;
}
//printf("%s", str);
system("pause");
以华为的结果看,给50分也是正常的,结果对,但离最优解还差的远。华为肯定会更看重逻辑思维、算法复杂度等等。这道题还是比较简单的,但是你用了一个三层for循环嵌套,下面又一个双while循环嵌套,算法复杂度飙到了N的3次方。
事实上完全可以用一个for就解决的问题,属于线性复杂度的问题。你的性能肯定相当之差。
我用java写了一个,单层循环解决的。你可以参考一下。
public class Test {
public static void main(String[] args) {
String s = "abbc65yyy&*ccc$b1baa00";
StringBuffer sb = new StringBuffer();
char[] array = s.toCharArray();
char temp = '0';
int nowCharCount = 1;
for (int i = 0; i < array.length; i++) {
char c = array[i];
if (isEnglish(c)) {
//如果刚才出现了字符c
if (temp == c) {
sb.deleteCharAt(sb.length() - 1);
sb.append(nowCharCount + 1);
nowCharCount++;
continue;
}
nowCharCount = 1;
temp = c;
sb.append(c);
sb.append(nowCharCount);
} else {
//初始化
nowCharCount = 1;
temp = '0';
}
}
System.out.println(sb.toString());
}
private static boolean isEnglish(char c) {
if ('a' <= c && c <= 'z') {
return true;
}
return false;
}
}
这么复杂,都不想看
计算两个日期间的时间,你可以将两个日期转换为时间戳,然后相减,在转为天、小时
这样不是好点么
华为看重的不只是结果,,而是你的思维以及算法
华为注重的是思维及算法过程,而不是最终的结果
我可能考虑先用正则表达式提出所有的字母,然后用标准库stack来输出了。虽然感觉上有点麻烦