《剣指offer》面接問題5:スペースの置き換え(C++実現)

1125 ワード

タイトル
文字列の各スペースを「%20」に置き換える関数を実装してください.例えば「We are happy.」と入力し、「We%20 are%20 happy.」と出力します.
コード#コード#
#pragma once
/**
 *                      ,          
 *         ,      。
 *        。
 */
//            
void replaceBlank(char m_string[], int capacity)
{
	if (m_string == nullptr || capacity <= 0)
		return;

	//             
	int lengthOfString = 0;
	int numberOfBlank = 0;
	int i = 0;
	while (m_string[i] != '\0')
	{
		++lengthOfString;
		if (m_string[i] == ' ')
			++numberOfBlank;
		++i;
	}

	//          
	int newLength = lengthOfString + numberOfBlank * 2;
	if (newLength > capacity)
		return;

	//                  
	int oldIndex = lengthOfString;
	int newIndex = newLength;
	while (oldIndex >= 0 && newIndex > oldIndex)
	{
		if (m_string[oldIndex] == ' ')
		{
			m_string[newIndex--] = '0';
			m_string[newIndex--] = '2';
			m_string[newIndex--] = '%';
		}
		else
			m_string[newIndex--] = m_string[oldIndex];
		--oldIndex;
	}
}

まとめ
スペースの数を計算して置換後の文字列の長さを求め、2つの補助ポインタはそれぞれ置換前後の文字列の末尾を指し、後から前へコピーします.時間複雑度O(n).