字符串-替换

字符串

  1. C/C++中字符串以‘\0’结尾,容易发生越界。常量字符串放在特定区域,当几个指针赋值给相同的字符串常量时,它们指向相同的地址。
    char str1[]=“hello”;
    char str2[]=“hello”; str != str2因为这是两个初始地址不同的数组
    char *str3 =“hello”;
    char *str4 =“hello”; str3==str4 常量字符串在内存中只有一个拷贝,两者指向同一地址

  2. C#中String的内容是不变的,一旦试图改变String的内容,就会产生新的实例。
    String经过多次修改,每一次都会产生新的临时对象,开销太大影响效率,可以使用StringBuilder.

  3. ref
    相同点: ref和out都是按地址传递,使用后都将改变原来参数的数值。
    1.方法定义和调用方法都必须显式使用 ref 关键字
    2.传递到 ref 参数的参数必须初始化,否则程序会报错

class Program
    {
        static void Main(string[] args)
        {
            int a = 6;
            int b = 66;
            Fun(ref a,ref b);
            Console.WriteLine("a:{0},b:{1}", a, b);//输出:72和6说明传入Fun方法是a和b的引用
        }
        static void Fun(ref int a, ref int b) {
            a = a+b;  //72,说明Main方法的a和b的值传进来了
            b = 6;
        }
    }
  1. out

    1.方法定义和调用方法都必须显式使用 out关键字
    2.out关键字无法将参数值传递到out参数所在的方法中,只能传递参数的引用
    ,所以out参数的参数值初始化必须在其方法内进行,否则程序会报错

  class Program
    {
        static void Main(string[] args)
        {
            int a=100;
            int b;
            Fun(out a, out b);
            Console.WriteLine("a:{0},b:{1}", a, b);//输出:3和1说明out参数传递进去的是a和b的引用,输出3说明a的参数值没有传入Fun方法中
        }
        static void Fun(out int a, out int b)
        {
            a = 1+2;
            b = 1;
        }
    }

在线编程-替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

思路

1、在原来的字符串上做替换
有两种解法,

  • 第一种是从前到后,遇到一次空格,后面的数据都要后移,这样重复操作太多。
  • 第二种是先统计空格数量n,使用两个指针,从后向前遍历。
    • 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
    • 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
    • 设置两个指针originalIndex和newIndex分别指向原字符串和新字符串的末尾位置。
    • 如果originalIndex指向内容不为空格,那么将内容赋值给newIndex指向的位置,如果originalIndex指向为空格,那么从newIndex开始赋值“02%”
    • 直到originalIndex==newIndex时表明字符串中的所有空格都已经替换完毕。

第一种方法的时间复杂度O(n^2),后一种时间复杂度O(n)。

  public String replaceSpace(StringBuffer str) {
          if(str==null||str.length()<=0)
            return "";
        int numBlank=0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' '){
                numBlank++;//统计空格的数量
            }
        }
       int oldLength=str.length();
        int newLength=str.length()+2*numBlank;//新的长度      
        int indexOfOld=oldLength-1;
        int indexOfNew=newLength-1;
        str.setLength(newLength);
       for(;indexOfOld>=0&&indexOfNew>indexOfOld;indexOfOld--){
           if(str.charAt(indexOfOld)==' '){
               str.setCharAt(indexOfNew--,'0');
               str.setCharAt(indexOfNew--,'2');
                str.setCharAt(indexOfNew--,'%');
           }else{
                
                str.setCharAt(indexOfNew--,str.charAt(indexOfOld));
           }
         
         }
        return str.toString();
    }

2、在新开辟的字符串上做替换

public String replaceSpace(StringBuffer str) {
        if(str==null){
            return null;
        }
       StringBuilder newStr = new StringBuilder();
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' '){
                newStr.append('%');
                newStr.append('2');
                newStr.append('0');
            }else{
                newStr.append(str.charAt(i));
            }
        }
        return newStr.toString();
    }

相关题目

*有两个排序的数组A1和A2,内存在A1的末尾有足够多余的空间容纳A2。
*请实现一个函数,把A2中的所有数字插入到A1中,并且所有数字是排序的.
*
思路:从末尾到头比较A1和A2中的数字,并把较大的数字复制到A1中的合适位置
*/

void mergeSortArray(int *a1, const int& length1, 
                    const int* a2, const int& length2)
{
    int length = length1+length2;
    //指向合并后数字的结尾
    int i2 = length-1;
    //指向合并前a1的结尾
    int i1 = length1-1;
    //指向a2数组的结尾元素
    int j = length2-1;  
    {
        if (a1[i1] > a2[j])
    {
        a1[i2] = a1[i1];
        --i1;
    }
    else
    {
        a1[i2] = a2[j];
        --j;
    }
    --i2;
    }
/*  
    // 将剩余的a1的元素copy a1的合并数组中
    // 没有必要做
    while (i1 >= 0)
    {
       a1[i2--] = a1[i1--];
    }
*/    
    //将剩余的a2中的元素copy到合并的a1中
    while (j >= 0)
    {
       a1[i2--] = a2[j--];
    }

}

猜你喜欢

转载自blog.csdn.net/u013244775/article/details/84960599