在一个字符串中找到第一个只出现一次的字符

草草草!!!

在数组的符合某种条件的所有元素中找到的最小的元素。

利用选择排序的原理保存最小元素的索引的方法查找最小值,记得!第一个索引设置成符合要求的元素的索引,不要随便设置成数组的第一个元素的索引。

24 -- 38行代码。 

在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。

(1)不使用额外空间,时间复杂度是O(n^2)

像冒泡排序那样,内存循环对外循环判断,比如第一个a,扫描后续元素,有a则不满足。

(2)哈希表。

k = 0; //填写哈希表时,每次设置成1就++k 
typedef struct {
    int flag;//初始化为0,第一次扫描到设置成1,再扫描到设置成2 
    int order;//初始化266,第几个设置成1的就设置成,几 
};//哈希表的结点

扫描完字符串后,就扫描哈希表:if(flag == 1 && a[ i ].order < 当前最小order索引值 )  就更新索引值。

时间复杂度是: 255 + 255 + n + 255 = O(n)

 1 typedef struct {
 2     int flag;//初始化成0,第一次出现设置成 1,再出现设置成2 
 3     int order; //初始化成0,第几次设置成1,就设置成几 
 4 }Node;
 5 char Search(char *str) {
 6     int k = 0;
 7     if(str == NULL) exit(-1);
 8     Node arr[128];
 9     for(int i = 0;i < 128; ++i) {
10         arr[i].flag = 0;
11         arr[i].order = 200;//任意大于128的整数 
12     }
13     
14     char *p = str;
15     for(;*p!='\0';++p) {
16         if(arr[*p].flag == 0) {
17             arr[*p].flag = 1;
18             arr[*p].order = k++;
19         }
20         else {
21             arr[*p].flag = 2;
22         }
23     }
24     int first;
25     int start = 0;
26     for(int i = 0; i < 128; ++i) {
27         if(start == 0) {
28             if(arr[i].flag == 1) {
29                first = i;
30                start = 1;
31             }
32         }    
33         else {
34             if(arr[i].flag == 1 && arr[i].order < arr[first].order)
35             first = i;
36         }
37     }
38     return first;
39 }

 

posted @ 2017-12-01 17:25  LevelIsBubble  阅读(469)  评论(0编辑  收藏  举报