您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法2:字符串与数组

2017-11-01 15:44 525 查看
1、求字符串长度:

int strlen(const char * str)
{
const char *s;

if (NULL == str)
{
return 0;
}

for (s = str; *s; s++){}

return (s - str);
}


2、计算字符串中是否有重复字符

//字符最多为256个,所以只要定义256的数组,标记字符出现的次数大于1即可
#define false 1
#define ture 0
int str_repeat_char(char * str)
{
char char_num[256] = {0};
char *s;

if (NULL == str)
{
return 0;
}

for (s = str; *s; s++)
{
if (char_num[*s] > 0)
return ture;
char_num[*s]++;
}

return false;
}


3、不使用其他结构反转字符串int reverse(char * str)
{
char tmp;
char *len = str;

if (NULL == str)
{
return 1;
}

while(*len)
{
len++;
}
/* 回退到最后一个字符 */
len--;

while (str < len)
{
tmp = *str;
*str++ = *len;
*len-- = tmp;
}

return 0;
}

4、比较两个字符串是否为变位词,通过变换位置两个字符串可以相等
方法一:将两个字符串排序,然后查看两个字符串是否相等

int bitsame1(char *str1, char *str2)
{
char tmp;
int i,j;
int len1 = 0, len2 = 0;

for (i = 0; str1[i] != '\0'; i++)
{
len1++;
for (j = i+1; str1[j] != '\0'; j++)
{
if (str1[i] < str1[j])
{
tmp = str1[i];
str1[i] = str1[j];
str1[j] = tmp;
}
}
}

for (i = 0; str2[i] != '\0'; i++)
{
len2++;
for (j = i+1; str2[j] != '\0'; j++)
{
if (str2[i] < str2[j])
{
tmp = str2[i];
str2[i] = str2[j];
str2[j] = tmp;
}
}
}

if (len1 != len2)
{
return false;
}

for (i = 0; str2[i] != '\0'; i++)
{
if (str1[i] != str2[i])
{
return false;
}
}

return ture;
}

方法二:统计字符串中各字符出现的次数是否相等

int bitsame2(char *str1, char *str2)
{
int char_sum[256] = {0};
int i;

while(*str1 && *str2)
{
char_sum[*str1++]++;
char_sum[*str2++]--;
}

/* 有一个字符串为结束,表示长度不一致,此种情况肯定非变位数 */
if (*str1 != 0 || *str2 != 0 )
{
return false;
}

/* 统计数组应该全为0即可 */
for(i = 0; i < 256; i++)
{
if (0 != char_sum[i])
return false;
}
return ture;
}

5、将一个字符串中空格字符串替换为其他字符,假设字符串的末尾空间足够长
int replace_blank(char *str, char *replace)
{
int blank_num = 0;
int len = 0, new_len = 0, replace_len = 0;

if ((NULL == str)||(NULL == replace))
{
return 1;
}

while(str[len])
{
if (' ' == str[len])
{
blank_num++;
}

len++;
}

while(replace[replace_len])
{
replace_len++;
}

new_len = len + (replace_len - 1)*blank_num;
printf("%d,%d,%d,%d\n", replace_len, len, new_len,blank_num);

for(; len >= 0;len--)
{
if (' ' == str[len])
{
new_len = new_len - replace_len + 1;
memcpy(str + new_len, replace, replace_len);
new_len--;
}
else
{
str[new_len--] = str[len];
}
}

return 0;
}

未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: