一个含有标点符号,数字,单词的字符串,将其中的单词反转
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];
}
}