字符串面试题

1.数字转换为字符
2.字符串的翻转
3.字符串的压缩
4.字符串的删除
5.查询子串在母串中出现的次数
6.回文字符串的判断

void IntToString(char arr[], int num)//数字转化字符
{
    int i = 0;
    while (1)
    {
        arr[i] = num % 10 + '0';
        num = num / 10;
        i++;
        if (num == 0)
            break;
    }
    arr[i] = '\0';
    ConvertString(arr);
}
void ConvertString(char arr[])//字符串的翻转
{
    int len = strlen(arr);
    int a = 0;
    int b = len - 1;
    while (a < len / 2)
    {
        char tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
        a++, b--;
    }
}
void CompresString(char arr[])//字符串压缩
{
    int i = 0;
    int j = 1;
    while (arr[i] != '\0')
    {
        if (arr[i] == arr[j])
            j++;
        else
        {
            if ((j - i) > 1)//把j-i这个整数转换为字符打印出来
            {
                char num[10] = { 0 };
                IntToString(num, j - i);//将数字转换为字符
                int len = strlen(num);
                strncpy(&arr[i + 1], num, len);//将数字转换的字符放入统计的字符后面,比如先统计a,将转换的数字放入a后
                //放入后,原来的字符会缩短,所以将后面的字符往前移动(j-(i+len+1))个位置
                int k = 0;
                for (k = j; arr[k] != '\0'; k++)
                {
                    arr[k - j + i + len + 1] = arr[k];
                }
                arr[k - j + i + len + 1] = '\0';
                i = i + len;
                j = i + 1;
            }
            i++;
            j = i + 1;
        }
    }
}
void DeleteString(char arr[])//字符串删除
{
    assert(arr);
    int i = 0;
    int j = 0;
    for (i = 0; arr[i] != '\0'; i++)
    {
        for (j = i + 1; arr[j] != '\0'; j++)
        {
            if (arr[i] == arr[j])
            {
                int k = j + 1;
                for (; arr[k] != '\0'; k++)
                {
                    arr[k - 1] = arr[k];
                }
                arr[k - 1] = '\0';
                j--;
            }   
        }
    }
}
int DemandString(const char arr[],const char des[])//查询子串出现次数
{
    assert(arr && des);
    int count = 0;
    char* src = arr;//母串头指针
    while (*src)
    {
        char* dis = src;//记住母串查询起始位置,方便下一次查询加一
        char* pos = des;//子串头指针
        if (*pos == *src)
        {
            while (*pos)
            {
                pos++, src++;
                if (*pos == *src)
                    continue;
                else
                    break;
            }
            src = dis;
        }
        if (*pos == '\0')
            count++;
        src++;
    }
    return count;
}
int PalinDromeString(const char arr[])//回文字符串判断
{
    assert(arr);
    int i = 0;
    int len = strlen(arr);
    int j = len - 1;
    while (i < len / 2)
    {
        if (arr[i] == arr[j])
        {
            i++;
            j--;
        }
        else
            return -1;
    }
    if (i <= len / 2)
        return 1;
    else
        return 0;
}

测试用例:

void test()
{
    //【1】字符串翻转
    printf("【1】字符串翻转>\n");
    char arr1[] = "I can fly!";
    printf("原字符串>%s\n", arr1);
    ConvertString(arr1);
    printf("翻转后>%s\n", arr1);
    //【2】字符串压缩
    printf("【2】字符串压缩>\n");
    char arr2[] = "aaaaaaaaaaaaabbbbbbbccccccddddef";
    printf("原字符串>%s\n", arr2);
    CompresString(arr2);
    printf("压缩后>%s\n", arr2);
    //【3】字符串删除
    printf("【3】字符串删除>\n");
    char arr3[] = "They are students";
    char arr10[] = "aeiou";
    printf("原字符串>%s\n",arr3);
    DeleteString(arr3,arr10);
    printf("删除后>%s\n", arr3);
    //【4】查询子串出现次数
    printf("【4】查询子串出现次数>\n");
    char arr4[] = "abc cba aabc bca abb cabc";
    char des[] = "abc";
    printf("原字符串>%s\n", arr4);
    printf("子串\"abc\"出现次数>%d\n", DemandString(arr4, des));
    //【5】判断回文字符串
    printf("【5】判断回文字符串>\n");
    char arr5[] = "aaabcbaaa";
    printf("原字符串>%s\n", arr5);
    printf("回文字符串?>%d\n",PalinDromeString(arr5));
}
发布了55 篇原创文章 · 获赞 19 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章