1、按特定顺序输出压缩
输入一段字符串,把相同的字符按出现顺序,归在一起,并压缩。
例如:
输入:SamSameCome
输出:
SSaammmeeCo
S2a2m3e2C1o1
【难度系数】 ▲ ▲ ▲ ▲
【分析】
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[100];
char str[100];
char s;
int i = 0;
int j = 0;
int count = 1;
int k = 0;
scanf("%s", ch);
for(i = 0; i < strlen(ch); i++)
{
if(ch[i] != ' ')
{
s = ch[i];
for(j = 0; j < strlen(ch); j ++)
{
if(s == ch[j])
{
str[k] = ch[j];
k++;
ch[j] = ' ';
}
}
}
}
printf("%s\n", str);
for(i = 0; i < strlen(str); i++)
{
if(str[i] == str[i + 1])
{
count ++;
}
else
{
printf("%c%d", str[i], count);
count = 1;
}
}
printf("\n");
return 0;
}
2、IP地址判断是否合法
输入一个IP地址,判断时候ip地址合法
ip地址由4位0-255组成 中间使用 . 隔开
合法的ip地址是:
21.45.34.112 是合法的
第一位不能为全0
0.45.34.112 是不合法的
每一位不能超过255
【代码】
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char ip[20] = {};
int i = 0, j = 0;
int num[4] = {};
scanf("%[^\n]", ip);
char *sep = ".";
char *p = strtok(ip, sep);
while(p != NULL)
{
num[i ++] = atoi(p);
p = strtok(NULL, sep);
}
if(num[0] == 0 || num[0] >255 || num[1] > 255
|| num[2] > 255 || num[3] > 255)
printf("NO\n");
else
printf("YES\n");
return 0;
}
3、字符串压缩
字符串原地压缩。题目描述:“eeeeeaaaff" 压缩为 "e5a3f2"。
字符串压缩算法,把s字符串压缩处理后结果保存在res中
比如:
输入
aaaaeefggg
输出为
a4e2f1g3
输入
hhfhhhhff
输出为
h2f1h4h2
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[100];
int i = 0;
int count = 1;
scanf("%s", ch);
for(i = 0; i < strlen(ch); i++)
{
if(ch[i] == ch[i + 1])
{
count ++;
}
else
{
printf("%c%d", ch[i], count);
count = 1;
}
}
return 0;
}
4、字符串解压
字符串原地压缩。题目描述:"e5a3f2" 解压缩为 “eeeeeaaaff"。
字符串压缩算法,把s字符串压缩处理后结果保存在res中
比如:
输入
a4e2f1g3
输出为
aaaaeefggg
输入
h2f1h4h2
输出为
hhfhhhhff
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[100];
char s[100];
int i = 0, j = 0;
int num = 0;
scanf("%s", ch);
for(i = 0; i < strlen(ch); i++)
{
if(ch[i] >= 'a' && ch[i] <= 'z')
{
if(ch[i + 1] >= '0' && ch[i + 1] <= '9')
{
if(ch[i + 2] >= '0' && ch[i + 2] <= '9')
{
num = (ch[i + 1] - 48) * 10 + (ch[i + 2] - 48);
}
else
num = ch[i + 1] - 48;
}
for(j = 0; j < num ; j++)
{
printf("%c", ch[i]);
}
}
}
printf("\n");
return 0;
}
5、字符串排序
输入一个字符串,然后返回连续最大的字符串
比如demo
1,3,3,3,4,4,4,4,4,0,0,0,4,4,4,4
,此例中由5个连续的4为最大连续子串,返回结果为44444.
1,3,3,3,4,4,4,4,4,0,0,0,0,0,0,5,5,5,5 返回44444;
1,3,3,3,5,5,5,5,5,4,4,4,4,4,0,0,0,0,0,0,4,4,4,4},返回55555;
这是公司OC面试题
【代码】
#include <stdio.h>
int main(void)
{
char ch[100];
int count = 1;
int i = 0;
int j = 0;
int max = 0;
scanf("%[^\n]", ch);
while(ch[i] != '\0')
{
if(ch[i] != '0' && ch[i] == ch[i + 2])
{
count ++;
}
else
{
if(count > max)
{
max = count;
j = i;
}
count = 1;
}
i += 2;
}
for(i = 0; i < max; i ++)
{
printf("%c", ch[j]);
}
printf("\n");
return 0;
}
6、查找相同的字串
返回在两字符串中第一个相同的子串(大于1个字符),并将子串输出
比如:
输入
adbAFEHHFS
acwfagAFEf
输出为
AFE
输入
qfdgJKlin
qdfgJKwfo
输出为
gJK
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch1[100] = {};
char ch2[100] = {};
int i = 0, j = 0;
int flag = 0, flag2 = 0;
scanf("%s", ch1);
getchar();
scanf("%s", ch2);
while(ch1[i] != '\0')
{
for(j = 0; j < strlen(ch2); j++)
{
if(ch1[i] == ch2[j] && ch1[i + 1] == ch2[j + 1])
{
flag = 1;
printf("%c", ch1[i]);
i++;
}
else
{
if(flag == 1)
{
flag2 = 1;
printf("%c", ch1[i]);
break;
}
}
}
if(flag2 == 1)
break;
i++;
}
printf("\n");
return 0;
}
7、单词升序排列
输入一段字符串将单词升序排列
比如:
输入 come good goals bad bed
输出:
bad bed come goals good
输入 I am Optimus Prime
输出:
I Optimus Prime am
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[100] = {};
int i = 0, j = 0, k = 0;
char *p[10] = {"zhangsan", "lisi", "wangwu"};
char *temp;
scanf("%[^\n]", ch);
p[0] = ch;
while(ch[i] != '\0')
{
if(ch[i] == ' ')
{
j++;
p[j] = &ch[i + 1];
ch[i] = '\0';
}
i++;
}
for(i = 0; i < j; i++)
{
for(k = 0; k < j - i; k++)
{
if(strcmp(p[k],p[k + 1]) > 0)
{
temp = p[k];
p[k] = p[k + 1];
p[k + 1] = temp;
}
}
}
for(i = 0; i <= j; i++)
{
printf("%s ", p[i]);
}
printf("\n");
return 0;
}
8、统计单词个数
输入一段字符串,统计其中的单词个数
比如:
输入 I like iOS
输出:
3
输入 this is Qian Feng College
输出:
5
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100] = {};
int i = 0;
int count = 0;
scanf("%[^\n]", str);
char *sep = " ";
char *p[10];
p[0] = strtok(str, sep);
while(p[i] != NULL)
{
count ++;
printf("%s\n", p[i]);
p[++i] = strtok(NULL, sep);
}
printf("The number of words is : %d\n", count);
return 0;
}
9、Objective-C和C++命名之争
Demo1:
Input:
long_and_mnemonic_identifier
Output:
longAndMnemonicIdentifier
Demo2:
Input:
longAndMnemonicIdentifier
Output:
long_and_mnemonic_identifier
Demo3:
Input:
bad_Style
Output:
Error!
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[100] = {};
int i = 0, j = 0;
scanf("%s", ch);
while(ch[i] != '\0')
{
if(ch[i] == '_' && (ch[i + 1] >= 97 && ch[i + 1] <= 122))
{
for(j = i; ch[j] != '\0'; j++)
{
ch[j] = ch[j + 1];
}
ch[i] -= 32;
}
else if(ch[i] >= 65 && ch[i] <= 90)
{
ch[strlen(ch) + 1] = '\0';
for(j = strlen(ch); j > i; j--)
{
ch[j] = ch[j - 1];
}
ch[i] = '_';
ch[i + 1] += 32;
}
else if((ch[i] == '_' && (ch[i + 1] >= 65 && ch[i + 1] <= 122)))
{
strcpy(ch, "Error!");
}
i++;
}
printf("%s\n", ch);
return 0;
}
10、字符串删除
输入一个字符串,然后再输入两个数字n 和 m,将这个字符串从第n(从0开始数)个字符开始删除,删除m个字符(包含第n个);后面的前移;(注意不要超过字符串范围)
比如:
输入:
12345
2
1
输出为1245
输入:
abcdefg
3
3
输出为abcg
输入
abcd
0
1
输出为bcd
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[20] = {};
int i = 0, j = 0, k = 0;
int n = 0, m = 0;
scanf("%s", ch);
scanf("%d %d", &n, &m);
while(ch[i] != '\0')
{
if(i == n && k < m)
{
for(j = i; j < strlen(ch) - 1 - k; j++)
{
ch[j] = ch[j + 1];
}
k ++;
i = n - 1 ;
}
i++;
}
ch[strlen(ch) - m] = '\0';
printf("%s\n", ch);
return 0;
}
11、字符串插入
输入两个字符串,然后再输入一个数字n,将第二个字符串插入到第一个字符串的第n个字符前面(从0开始数);第n个字符(包含第n个)后面的字符后移
比如:
输入:
hello
world
2
输出为heworldllo
输入:
1000
phone
3
输出为100phone0
输入
abcd
1234
0
输出为1234abcd
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch1[50] = {};
char ch2[50] = {};
int num = 0;
int i = 0, j = 0, k = 0;
scanf("%s", ch1);
getchar();
scanf("%s", ch2);
scanf("%d", &num);
if(num == strlen(ch1))
{
j = 0,k = 0;
for(k = strlen(ch1); k < strlen(ch1) + strlen(ch2); k++)
{
ch1[k] = ch2[j ++];
}
}
else
{
while(ch1[i] != '\0')
{
if(i == num)
{
for(j = strlen(ch1) + strlen(ch2) - 1; j >= i + strlen(ch2); j --)
{
ch1[j] = ch1[j - (int)strlen(ch2)];
}
j = 0;
for(k = num; k < num + strlen(ch2); k++)
{
ch1[k] = ch2[j++];
}
}
else if(num == strlen(ch1))
{ j = 0,k = 0;
for(k = strlen(ch1); k < strlen(ch1) + strlen(ch2); k++)
{
ch1[k] = ch2[j ++];
}
}
i++;
}
}
ch1[strlen(ch1) + strlen(ch2)] = '\0';
printf("%s\n", ch1);
return 0;
}
12、字符串替换
输入两个字符串,然后再输入两个数字n 和 m,将第一个字符串从第n(从0开始数)个字符开始,数m个字符(包含第n个)替换为第二个字符串;(注意不要超过字符串的范围)
比如:
输入:
12345 abcde
1 2
输出为1abcde45
输入:
12345 abcde
0
4
输出为abcde5
输入
Iloveyou hate
1
4
输出为Ihateyou
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch1[20] = {};
char ch2[20] = {};
int n = 0, m = 0;
int i = 0, j = 0, k = 0;
scanf("%s", ch1);
getchar();
scanf("%s", ch2);
scanf("%d %d", &n, &m);
//首先判断替换的位置是否到末尾
//是,那么就删除后面的字符串,直接令尾尾‘\0’,再将替换的字符串添加的末尾
if(strlen(ch1) == n + m)
{
ch1[strlen(ch1) - m] = '\0';//删除
for(k = strlen(ch1) ; k < strlen(ch1) + strlen(ch2); k++)
{
ch1[k] = ch2[j++];
}
ch1[strlen(ch1) + strlen(ch2)] = '\0';
}
else
{//不是
//那么就要先删掉需要替换的那部分字符串,即将后面的往前移动
while(ch1[i] != '\0')
{
if(i == n && k < m)
{
for(j = i; j < strlen(ch1) - 1 - k; j++)
{
ch1[j] = ch1[j + 1];
}
k ++;
i = n - 1;
}
i++;
}
ch1[strlen(ch1) - m] = '\0';
//然后,将替换的字符串插入进来,字符串后移
i = 0;
while(ch1[i] != '\0')
{
if(i == n)
{
for(j = strlen(ch1) + strlen(ch2) - 1; j > i - 1 + strlen(ch2); j--)
{
ch1[j] = ch1[j - strlen(ch2)];
}
for(k = 0; k < strlen(ch2); k++)
{
ch1[i + k] = ch2[k];
}
}
i++;
}
ch1[strlen(ch1) + strlen(ch2)] = '\0';
}
printf("%s\n", ch1);
return 0;
}
13、字符串抽取
输入两个字符串,然后输入一个数字n和数字m,将第一个字符串抽取出从第n(从0开始)个开始数m个字符构成一个新的字符串并输出,然后把这个新的字符串插入到第二个字符串的第n(从0开始)个字符后输出(注意不要超过字符串范围)
比如:
12345 67890
2 1
输出为673890
输入:
12345 67890
0 3
输出为12367890
输入:
abcde xyz
2
3
输出为xycdez
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch1[20] = {};
char ch2[20] = {};
char str[20] = {};
int n = 0, m = 0;
int i = 0, j = 0, k = 0;
scanf("%s", ch1);
getchar();
scanf("%s", ch2);
scanf("%d %d", &n, &m);
//首先抽取字符串,放到另外的字符串数组str中
while(ch1[i] != '\0')
{
if(i == n)
{
for(j = n; j < n + m; j++)
{
str[k++] = ch1[j];
}
str[k] = '\0';
}
i++;
}
//插入
i = 0, k = 0;
while(ch2[i] != '\0')
{
if(i == n)
{
//向右移位
for(j = strlen(ch2) - 1 + m; j >= i + m; j--)
{
ch2[j] = ch2[j - m];
}
//插入
for(j = n; j < n + strlen(str); j++)
{
ch2[j] = str[k++];
}
ch2[strlen(ch2) + m] = '\0';
}
i++;
}
printf("%s\n", ch2);
return 0;
}
14、字符串交换
从键盘输入五个字符串,把这些字符串地址放入一个指针数组中,然后输入两个数n和m(n 和m是数组的下标,所以不要越界),把数组的下标n和下标m进行交换,并且打印数组中的字符串;
比如:
输入:
I am Optimus Prime lucy
0 1
输出为
am
I
Optimus
Prime
lucy
输入:
Hi welcome to qianfeng lilei
2 3
输出为
Hi
welcome
qianfeng
to
lilei
输入
abc def ghi jkl heihei
0 4
输出为
heihei
def
ghi
jkl
abc
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100] = {};
int n = 0, m = 0;
char *sep = " ";
char *p[10] = {};
int i = 0, j = 0;
char *temp = NULL;
scanf("%[^\n]", str);
scanf("%d %d", &n, &m);
p[0] = strtok(str, sep);
while(p[i])
{
p[++i] = strtok(NULL, sep);
}
temp = p[n];
p[n] = p[m];
p[m] = temp;
for(j = 0; j < i; j++)
{
printf("%s\n", p[j]);
}
return 0;
}
15、字符串数组查找
输入五个字符串,然后再输入一个字符串,打印出最后一个字符串是前五个中第几个被输入的(如果出现相同的只打印第一次是第几个被输入的)如果不在前五个中则返回-1。
比如:
输入:
12345 abc def hello
abc
输出为2
输入:
abc hello hello world world
hello
输出为2
输入
abcde ab cd hello hello
cd
输出为3
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[100] = {};
char str2[20] = {};
scanf("%[^\n]", str1);
getchar();
scanf("%[^\n]", str2);
char *sep = " ";
char *p[10] = {};
int i = 0, j = 0;
p[0] = strtok(str1, sep);
while(p[i])
{
p[++i] = strtok(NULL, sep);
}
for(j = 0; j < i; j++)
{
if(strcmp(str2, p[j]) == 0)
{
printf("%d\n", j + 1);
break;
}
}
if(j == i)
{
printf("-1\n");
}
return 0;
}
16、字符串拼接
从键盘输入个数不定的字符串(不超过10个),以最后一个字符串整体连接到每两个字符串之间,组成一个新的字符串,并且输出这个字符串;
比如:
输入:
I am Optimus Prime!
:
输出为
I:am:Optimus:Prime!
输入:
Hi welcome to qianfeng
#@
输出为
Hi#@welcome#@to#@qianfeng
输入
abc def ghi jkl heihei haha mygod
**
输出为
abc**def**ghi**jkl**heihei**haha**mygod
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100] = {};
char ch[10] = {};
scanf("%[^\n]", str);
getchar();
scanf("%[^\n]", ch);
char *sep = " ";
char *p[10] = {};
int i = 0, j = 0;
p[0] = strtok(str, sep);
while(p[i])
{
p[++i] = strtok(NULL, sep);
}
for(j = 0; j < i; j++)
{
if(j < i - 1)
{
printf("%s", p[j]);
printf("%s", ch);
}
else
{
printf("%s", p[j]);
}
}
return 0;
}
17、字符串分割
从键盘输入一个字符串,然后再输入一个字符串,以第二个字符串整体作为分割条件把第一个字符串进行分割,然后输出分割之后的单词;
比如:
输入:
I:am:Optimus:Prime!
:
输出为
I
am
Optimus
Prime!
输入:
Hi#@welcome#@to#@qianfeng
#@
输出为
Hi
welcome
to
qianfeng
输入
abc@#def@ghi#@jkl
@#
输出为
abc
def@ghi
jkl
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch[50] = {};
char str[10] = {};
char *p[10];
int i = 0, j = 0, r = 0, k = 0;
scanf("%[^\n]", ch);
getchar();
scanf("%[^\n]", str);
p[0] = ch;
while(ch[i] != '\0')
{
r = i;
for(k = 0; k < strlen(str); k++)
{
if(ch[r++] != str[k])
break;
}
if(k == strlen(str))
{
p[++j] = &ch[i + strlen(str)];
ch[i] = '\0';
}
i++;
}
for(i = 0; i <= j; i++)
{
printf("%s\n", p[i]);
}
return 0;
}
18、统计字母在字符串中出现的次数
输入一串小写字母(以“.”为结束标志),统计出每个字母在该字符串中出现的次数(若某字母不出现,则不要输出)。
【代码】
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100] = {};
int i = 0, j = 0;
int count = 0;
char s = 0;
scanf("%[^.]", str);
for(i = 0; i < strlen(str) - 1; i++)
{
if(str[i] != ' ')
{
s = str[i];
count = 1;
for(j = i + 1; j < strlen(str) - 1; j++)
{
if(s == str[j])
{
count ++;
str[j] = ' ';
}
}
printf("%c: %d\n", str[i], count);
}
}
return 0;
}原文地址:http://blog.csdn.net/zmp1123/article/details/45953509