算法 字符串与数组(2)

一个含有标点符号,数字,单词的字符串,将其中的单词反转
bool isPunctationOrSpace(char *character)//判断标点符号或空格
{
	return *character == ' ' || *character == ',' || *character == '.';
}

bool isNumber(char *character)//判断数字
{
	return *character >= '0'&&*character <= '9';
}

bool needReverse(char *sentence, int *offset)
{
	int length = (int)strlen(sentence);
	bool needReverse = false;
	*offset = 0;
	while (!isPunctationOrSpace(sentence + (*offset)) && (*offset) < length)
	{
		if (isNumber(sentence + (*offset)))
		{
			needReverse = true;
		}
		(*offset)++;
	}
	return needReverse;
}
void reverseWord(char *word, int length)//需要反转的单词i指向头,j指向尾,互相交换并向中间移动直到相遇
{
	int i = 0, j = length - 1;
	while (i < j)
	{
		swap(*(word + i), *(word + j));
		i++;
		j--;
	}
}
void reverseSentence(char *sentence)
{
	int length = (int)strlen(sentence);
	int offset;
	for (int i = 0; i < length;)
	{
		if (needReverse(sentence+i,&offset))
		{
			reverseWord(sentence + i, offset);
		}
		i += (offset + 1);
	}
}
给定字符串和偏移量,逐偏移量旋转字符串
string RotateString(string A, int offset)
{
	if (A.empty() || A.size())
	{
		return A;
	}
	int len = A.size();
	offset %= len;
	reverse(A, 0, len - offset - 1);
	reverse(A, len - offset, len - 1);
	reverse(A, 0, len - 1);
}
void reverse(string &str, int start, int end)
{
	while (start < end)
	{
		char temp = str[start];
		str[start] = str[end];
		str[end] = temp;
		start++;
		end--;
	}
}

合并两个有序数组
void mergeSortedArray(int A[], int m, int B[], int n)
{
	int index = n + m;//m和n分别是两个数组大小
	while (m > 0 && n > 0)
	{
		if (A[m - 1] > B[n - 1])//A的最后一个元素值大于B最后一个元素值时
		{
			A[--index] = A[--m];
		}
		else
		{
			A[--index] = B[--n];
		}
	}
	while (n > 0)//如果n还有元素,继续排序
	{
		A[--index] = B[--n];
	}
	while (m > 0)//m还有元素,继续排序
	{
		A[--index] = A[--m];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值