1、按特定順序輸出壓縮
輸入一段字符串,把相同的字符按出現順序,歸在一起,並壓縮。
例如:
輸入:SamSameCome
輸出:
SSaammmeeCo
S2a2m3e2C1o1
【難度系數】 ▲ ▲ ▲ ▲
【分析】
【代碼】
#include#include 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#include #include 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#include 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#include 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面試題
【代碼】
#includeint 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#include 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#include 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#include 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#include 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#include 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#include 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#include 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#include 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#include 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#include 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#include 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#include 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#include 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; }