1.要找到尾节点
2.定义前后两个指针
3.从后向前遍历使用while()遍历
class Solution {
public:
void replaceSpace(char *str,int length) {
//遍历一边字符串找出空格的数量
if(str==NULL||length<0)
return ;
int i=0;
int oldnumber=0;//记录以前的长度
int replacenumber=0;//记录空格的数量
while(str[i]!='\0')
{
oldnumber++;
if(str[i]==' ')
{
replacenumber++;
}
i++;
}
int newlength=oldnumber+replacenumber*2;//插入后的长度
if(newlength>length)//如果计算后的长度大于总长度就无法插入
return ;
int pOldlength=oldnumber; //注意不要减一因为隐藏个‘\0’也要算里面,这是针对C++的特性
int pNewlength=newlength;
while(pOldlength>=0&&pNewlength>pOldlength)//放字符
{
if(str[pOldlength]==' ') //碰到空格就替换
{
str[pNewlength--]='0';
str[pNewlength--]='2';
str[pNewlength--]='%';
}
else //不是空格就把pOldlength指向的字符装入pNewlength指向的位置
{
str[pNewlength--]=str[pOldlength];
}
pOldlength--; //不管是if还是elsr都要把pOldlength前移
}
}
};
针对解决合并两个已排序的数组,
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//如何实现从后向前遍历,关键是找到尾节点,之后-1向前遍历
int i=m-1,j=n-1,k=m+n-1;
while(i>=0&&j>=0){
if(nums1[i]>nums2[j]){
nums1[k]=nums1[i];
i--;
}else{
nums1[k]=nums2[j];
j--;
}
k--;
}
//考虑这样一种情况,当nums1的所有数字都已经添加完了,而此时nums2的数全部小于nums1的数,将num2添加到nums1
while(j>=0){
nums1[k]=nums2[j];
k--;
j--;
}
}
}
public void merge(int[] nums1, int m, int[] nums2, int n) {
//如何实现从后向前遍历,关键是找到尾节点,之后-1向前遍历
int i=m-1,j=n-1,k=m+n-1;
while(i>=0&&j>=0){
if(nums1[i]>nums2[j]){
nums1[k]=nums1[i];
i--;
}else{
nums1[k]=nums2[j];
j--;
}
k--;
}
//考虑这样一种情况,当nums1的所有数字都已经添加完了,而此时nums2的数全部小于nums1的数,将num2添加到nums1
while(j>=0){
nums1[k]=nums2[j];
k--;
j--;
}
}
}