字符串面試題

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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章