zoukankan      html  css  js  c++  java
  • 剑指Offer替换空格

    题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

    在原来的字符串上替换,并保证输入的字符串后面有足够的空余内存。

    思路

    解法一:最容易想到的就是当遇到空格时,将后面的字符向后面移动2位。此方法的时间复杂度为O(N^2)。

    解法二:

      首先遍历字符串,统计字符串中的空格数目,计算新的字符长度 newLen = oldLen + 2 * 空格数;

      依次从字符串后面开始复制,分别用p1,p2指向旧新字符串的末尾,当遇到空格时,依次赋值‘0’,‘2’,‘%’;当p1 == p2时,过程终止(p1,p2之前的都是相同的,不用再复制)。此方法时间复杂度为O(N)。

    code:

     1 //len 为字符数组str的总容量
     2 void ReplaceBlank(char *str, int len)
     3 {
     4     if (str == NULL || len <= 0)
     5     {
     6         return ;
     7     }
     8     //oldLen为字符串str的实际长度
     9     int oldLen = 0;
    10     int NumberOfBlank = 0;
    11     int i = 0;
    12     while (str[i] != '\0')
    13     {
    14         ++oldLen;
    15         if (str[i] == ' ')
    16         {
    17             ++NumberOfBlank;
    18         }
    19         ++i;
    20     }
    21     //newLen 为把空格替换成'%20'之后的长度
    22     int newLen = oldLen + 2 * NumberOfBlank;
    23     if (newLen > len)
    24     {
    25         return;
    26     }
    27 
    28     int indexOfOriginal = oldLen;
    29     int indexOfnew = newLen;
    30     while (indexOfOriginal >= 0 && indexOfnew > indexOfOriginal)
    31     {
    32         if (str[indexOfOriginal] == ' ')
    33         {
    34             str[indexOfnew--] = '0';
    35             str[indexOfnew--] = '2';
    36             str[indexOfnew--] = '%';
    37         }
    38         else
    39         {
    40             str[indexOfnew--] = str[indexOfOriginal];
    41         }
    42         --indexOfOriginal;
    43     }
    44 }

     相关题目:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有数字是排序的。(假设A1和A2中已有数据均不含0)

    基本思想和上面题目一致。利用0作为结尾标记,并从后面开始复制,避免了从前面复制引起的数据移动。

    code:

     1 //len1,len2分别为数组A1,A2的总长度, 返回合并后A1的实际长度
     2 int MergeArray(int *A1, int *A2, int len1, int len2)
     3 {
     4     if (A1 == NULL || A2 == NULL || len1 <= 0 || len2 <= 0)
     5     {
     6         return -1;
     7     }
     8     int lenOfA1 = 0;
     9     int lenOfA2 = 0;
    10     int i = 0;
    11     //计算A1的现有长度
    12     while (A1[i] != 0 && i < len1)
    13     {
    14         ++lenOfA1;
    15         ++i;
    16     }
    17     i = 0;
    18     //计算A2的现有长度
    19     while (A2[i] != 0 && i < len2)
    20     {
    21         ++lenOfA2;
    22         ++i;
    23     }
    24     //A1合并后的长度
    25     int newlenOfA1 = lenOfA1 + lenOfA2;
    26     if (newlenOfA1 > len1)
    27     {
    28         return -1;
    29     }
    30     
    31     int indexOfOriginal = lenOfA1 - 1;
    32     int indexOfnew = newlenOfA1 - 1;
    33     int indexOfA2 = lenOfA2 - 1;
    34 
    35     while (indexOfnew >= 0 && indexOfnew > indexOfOriginal)
    36     {
    37         //indexOfnew == indexOfOriginal对应A2元素已用完
    38         //A1已有元素已用完
    39         if (indexOfOriginal < 0)
    40         {    //A2剩余元素全赋值到A1中
    41             while (indexOfA2 >= 0)
    42             {
    43                 A1[indexOfnew--] = A2[indexOfA2--];
    44             }
    45         }
    46 
    47         if (A1[indexOfOriginal] < A2[indexOfA2])
    48         {
    49             A1[indexOfnew--] = A2[indexOfA2--];
    50         } 
    51         else
    52         {
    53             A1[indexOfnew--] = A1[indexOfOriginal--];
    54         }
    55     }
    56     return newlenOfA1;
    57 }

  • 相关阅读:
    git的版本回退
    elementui的表格有多选框时翻页记住之前选择的数据
    git操作总结
    POJ 3107 Godfather
    HDU 4405 Aeroplane chess
    ZOJ 3626 Treasure Hunt I
    UVA 10537 Toll! Revisited
    POJ 3093 Margaritas on the River Walk
    POJ 1655 Balancing Act
    POJ 2342 Anniversary party
  • 原文地址:https://www.cnblogs.com/ivorfeng/p/3052309.html
Copyright © 2011-2022 走看看