码迷,mamicode.com
首页 > 编程语言 > 详细

算法题解

时间:2015-06-14 18:18:50      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

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 }

技术分享

 

算法题解

标签:

原文地址:http://www.cnblogs.com/CoolRandy/p/4575267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!