1、查找一個字符串中第一個只出現兩次的字符。
對於這個問題,我們可以考慮用數組—因爲字符的存儲方式是,按數字存儲的,A–z(65–122); 每存儲一個就記錄其個數,最後比較每個字符出現的個數可以求出哪個字符出現過兩次;
#include <stdio.h>
#include<stdlib.h>
char second_char(char* str)
{
char *p=str;
unsigned char arr[256]={0};
while(*p)
{
arr[*p]++;
p++;
}
p=str;
while(*p)
{
//比較每個字符出現的個數可以求出哪個字符出現過兩次;
if(arr[*p]==2)
{
return *p;
}
p++;
}
return -1;
}
比如:“abcdefabcdefabc”中第一個只出現兩次爲‘d’,
其時間複雜度爲O(N),空間複雜度爲O(1)
2、一個數組中有一個數字的次數超過了數組的一半,求出這個字符
對於這個問題,我同樣也考慮用數組; 每存儲一個就記錄其個數,最後比較每個字符出現的次數超過了數組的一半;
int N_of_num(int *str,int size)
{
int *p=str;
unsigned int arr[12]={0};
int length=size;
while(length)
{
arr[*p]++;
p++;
length--;
}
p=str;
int L=size/2;
while(*p)
{
if(arr[*p]>=L)
{
return *p;
}
p++;
}
return NULL;
}
如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超過一半的數字是2。
但是上面這個程序問題很大,它只適合0~9之間的元素,那如果這個元素,大於9 ,怎麼辦呢?這個程序就會出問題…….
對於這個算法,還是《劍指offer》上面的思想最優,我就不照搬了。