【剑指offer】字符串基础知识

字符串

面试题五:替换空格

#include
using std::cout;

/**
 * 把字符串的空格替换为"%20"
 * 注意两种场景:1)在原来的字符串上进行替换;2)创建新的字符串,并在新的字符串上修改
 * 本代码是在原来字符串上进行替换
 */
void ReplaceBlank(char string[], int length)  //length是字符串数组的总容量
{
    if (string == NULL || length <= 0) {
        return;
    }

    int originalLength = 0;  //字符串string的实际长度
    int numberOfBlank = 0;
    int i = 0;
    while (string[i] != '\0') {
        originalLength ++;
        if (string[i] == ' ') {
            numberOfBlank++;
        }
        i++;
    }

    int newLength = originalLength + numberOfBlank * 2;
    if (newLength > length) {
        return;
    }

    int indexOfOrigin = originalLength;
    int indexOfNew = newLength;
    while (indexOfOrigin >= 0 && indexOfNew > indexOfOrigin) {
        if (string[indexOfOrigin] == ' ') {
            string[indexOfNew--] = '0';
            string[indexOfNew--] = '2';
            string[indexOfNew--] = '%';
        } else {
            string[indexOfNew--] = string[indexOfOrigin];
        }
        --indexOfOrigin;
    }
}

int main()
{
    char string[] = "We are happy.";
    ReplaceBlank(string,20);
    cout << string;
    return 0;
}

相关题目:

有两个排序的数组A1和A2,内存在A1 的末尾有足够的空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1 中,并且所有数字是有序的。

类似:【LeetCode】Merge Sorted Array

从后往前填充!!!

1、当两个数组都有元素的时候,填充大的末尾,如果有一个数组的数用完了,说明剩下的所有数都小于当前的填充位置;
2、如果第一个数组用完,说明剩下的全是数组A2,把数组A2全部填充进去就可以了;
3、如果是第二个数组用完,说明剩下的全是数组A1,不用填充,因为数组A1已经存在了。

void merge(int nums1[], int m, int nums2[], int n)
{
    int i = m-1, j = n-1, writeIdx = m+n-1;
    while (i >= 0 && j >= 0) {
        nums1[writeIdx--] = nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];
    }
    while (j >= 0) {
        nums1[writeIdx--] = nums2[j--];
    }
}

你可能感兴趣的:(笔记)