1、利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<conio.h> 4 #include <string.h> 5 6 /* 7 重复字符压缩 8 */ 9 void RepeatCharReduce(char *str, int n, char *s){ 10 11 // char s[20]; 12 char tmp = str[0]; 13 s[0] = tmp; 14 int j = 1; 15 int count = 1; 16 for(int i = 1; i <n; i++){ 17 if(str[i] == tmp){ 18 count++; 19 } 20 else{ 21 s[j] = count; 22 j++; 23 tmp = str[i]; 24 s[j] = str[i]; 25 count = 1; 26 j++; 27 } 28 } 29 s[j] = count; 30 31 } 32 33 int main(){ 34 char str[] = "aabcccccaaa"; 35 char s[20] = "0"; 36 RepeatCharReduce(str, 11, s); 37 for(int j = 0; j < 11; j++){ 38 printf("%c", str[j]); 39 } 40 printf("\n"); 41 for(int i = 0; i < 11; i += 2){ 42 printf("%c%d", s[i], s[i+1]); 43 } 44 printf("\n"); 45 getch(); 46 return 0; 47 }
2、给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符‘a‘和‘b‘移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<conio.h> 4 #include<math.h> 5 #include<time.h> 6 #include <string.h> 7 8 void ReverseString(char *s, int from, int to) 9 { 10 while(from < to){ 11 char t = s[from]; 12 s[from++] = s[to]; 13 s[to--] = t; 14 } 15 } 16 17 void LeftRotateString(char *s, int n, int m) 18 { 19 m %= n; 20 ReverseString(s, 0, m-1); 21 ReverseString(s, m, n-1); 22 ReverseString(s, 0, n-1); 23 } 24 25 int main(){ 26 char s[] = "abcdefgh"; 27 for(int i = 0; i < 8; i++){ 28 printf("%c ", s[i]); 29 } 30 printf("\n"); 31 LeftRotateString(s, 8, 3); 32 for(int i = 0; i < 8; i++){ 33 printf("%c ", s[i]); 34 } 35 printf("\n"); 36 getch(); 37 return 0; 38 }
3、链表翻转。给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→6→5,用程序实现。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<conio.h> 4 #include<math.h> 5 #include<time.h> 6 #include <string.h> 7 8 #define OK 1 9 #define ERROR 0 10 #define TRUE 1 11 #define FALSE 0 12 13 #define MAXSIZE 20 /* 存储空间初始分配量 */ 14 15 typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 16 typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ 17 18 typedef struct Node{ 19 int data; 20 struct Node *next; 21 }Node, *LinkList; 22 23 /* 初始化顺序线性表 */ 24 Status InitList(LinkList *L) 25 { 26 *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */ 27 if(!(*L)) /* 存储分配失败 */ 28 { 29 return ERROR; 30 } 31 (*L)->next=NULL; /* 指针域为空 */ 32 return OK; 33 } 34 35 36 /* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */ 37 void CreateListHead(LinkList *L, int n) 38 { 39 LinkList p; 40 int i; 41 srand(time(0)); /* 初始化随机数种子 */ 42 *L = (LinkList)malloc(sizeof(Node)); 43 (*L)->next = NULL; /* 先建立一个带头结点的单链表 */ 44 for (i=0; i < n; i++) 45 { 46 p = (LinkList)malloc(sizeof(Node)); /* 生成新结点 */ 47 p->data = rand()%100+1; /* 随机生成100以内的数字 */ 48 printf("%d ", p->data); 49 p->next = (*L)->next; 50 (*L)->next = p; /* 插入到表头 */ 51 } 52 } 53 /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ 54 int ListLength(LinkList L) 55 { 56 int i=0; 57 LinkList p=L->next; /* p指向第一个结点 */ 58 while(p) 59 { 60 i++; 61 p=p->next; 62 } 63 return i; 64 } 65 Status visit(ElemType c) 66 { 67 printf("-> %d ",c); 68 return OK; 69 } 70 /* 初始条件:顺序线性表L已存在 */ 71 /* 操作结果:依次对L的每个数据元素输出 */ 72 Status ListTraverse(LinkList L) 73 { 74 LinkList p=L->next; 75 while(p) 76 { 77 visit(p->data); 78 p=p->next; 79 } 80 printf("\n"); 81 return OK; 82 } 83 84 LinkList ListReverse2(LinkList L) 85 { 86 LinkList current, p; 87 if (L == NULL) 88 { 89 return NULL; 90 } 91 current = L->next; 92 while (current->next != NULL) 93 { 94 p = current->next; 95 current->next = p->next; 96 p->next = L->next; 97 L->next = p; 98 } 99 ListTraverse(L); 100 return L; 101 } 102 /* 103 1、链表翻转。给出一个链表和一个数k, 104 比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3, 105 若k=3,翻转后3→2→1→6→5→4, 106 若k=4,翻转后4→3→2→1→6→5,用程序实现。 107 108 对于链表而言只是对指针的指向调换,所以不会耗费额外存储空间,空间复杂度O(1) 109 时间复杂度此处看来也是线性的 110 */ 111 112 LinkList ReverseSpecArea(LinkList L, int k){ 113 LinkList current, p, q; 114 LinkList temp; 115 int i = 1; 116 if (L == NULL) 117 { 118 return NULL; 119 } 120 current = L->next; 121 122 while (current->next != NULL) 123 { 124 p = current->next; 125 current->next = p->next; 126 p->next = L->next; 127 L->next = p; 128 if(++i >= k){ 129 break; 130 } 131 }//current始终指向起先除去头结点的第一个元素 132 temp = current; 133 current = current->next; 134 while(current->next != NULL){ 135 p = current->next; 136 current->next = p->next; 137 p->next = temp->next; 138 temp->next = p; 139 } 140 ListTraverse(L); 141 142 return L; 143 } 144 145 146 void ReverseString(char *s, int from, int to) 147 { 148 while(from < to){ 149 char t = s[from]; 150 s[from++] = s[to]; 151 s[to--] = t; 152 } 153 } 154 155 void LeftRotateString(char *s, int n, int k) 156 { 157 k %= n; 158 ReverseString(s, 0, k-1); 159 ReverseString(s, k, n-1); 160 } 161 162 int main(){ 163 LinkList L; 164 LinkList h; 165 Status i; 166 int j,k,pos,value; 167 int length; 168 char opp; 169 ElemType e; 170 i=InitList(&L); 171 printf("%d\n", i); 172 173 CreateListHead(&L,10); 174 printf("\n"); 175 length = ListLength(L); 176 printf("%d\n", length); 177 printf("整体创建L的元素(头插法):\n"); 178 ListTraverse(L); 179 printf("\n"); 180 h = L->next; 181 while(h){ 182 printf("%d ", h->data); 183 h = h->next; 184 } 185 printf("\n"); 186 ListReverse2(L); 187 // printf("反转指定位置3的元素\n"); 188 // ReverseSpecArea(L, 3); 189 printf("反转指定位置5的元素\n"); 190 ReverseSpecArea(L, 5); 191 192 getch(); 193 return 0; 194 }
时间: 2024-10-10 23:03:35