zoukankan      html  css  js  c++  java
  • 字符串替换算法思考

    题目:URL中不允许出现空格等特殊字符,因此需要将用户输入的URL转义输出。如空格对应的ASCII码为32 即0x20,因此用%20代替。如 "we are one" 变换成"we%20are%20one"。要求程序的时间复杂度为O(n)。
    思考:
    方法一:从头到尾遍历,找到空格后,依次将空格后面元素后移两位,插入%20,然后遍历一遍即可完成。由于每次出现空格都需要将后面的所有元素做移动处理,因此这种方法的时间负责度为O(n^2)。
    方法二:事先遍历一遍字符串,确定空格的个数,从而确定新字符串的长度,然后从尾部开始,逐一复制原始字符串元素到新的位置上,遇到空格时,新元素中插入0 2 %,原始元素指针后移一个单元即可。
    前提:存储容量,确保原始字符数组大小足够容纳新的字符串。
    这种算法的时间复杂度为O(n),很好的提高了效率。

    #include "stdafx.h" #include <iostream> #include "string" using namespace std; void ReplaceBlank(char *p, int length); int _tmain(int argc, _TCHAR* argv[]) { char *str = "we are one"; char str2[20]; strcpy_s(str2,str); ReplaceBlank(str2,20); cout << str << endl; cout << str2; return 0; } void ReplaceBlank(char *p, int length) { if (p == NULL || length <= 0) return; //统计字符串长度 int original_length = 0; int num_blank = 0; int i = 0; while (p[i] != '') { if (p[i] == ' ') { num_blank++; } original_length++; i++; } int new_length = original_length + num_blank * 2; if (new_length > length) return; int original_index = original_length; int new_index = new_length; //移动或替换 时间复杂度O(n) while (original_index >= 0 && new_index > original_index) { if (p[original_index] == ' ') { original_index--; p[new_index--] = '0'; p[new_index--] = '2'; p[new_index--] = '%'; } else { p[new_index--] = p[original_index--]; } } }

     题目2:有两个已经排序的数组A1 和 A2,A1的末尾有足够的空余空间容纳A2,现在要求将A2所有数字插入到A1中,并保持A1所有数组元素排序。

    思路1:每次从A2中取一个元素,然后依次和A1中元素比较,找到合适位置后,移动插入位置后的所有元素,然后插入新元素,

    循环进行,直至A2中所有元素均已插入到A1中。

    思路2:

    1. 确定A1和A2各自的长度n1,n2,从而确定插入后的数组长度n=n1+n2;
    2. 三个指针,一个指向n1最后一个元素,一个指向n2最后一个元素,一个指向新数组的最后一个元素。
    3. 比较n1 n2最后一个元素的大小,将大的插入新数组中,然后指针移位
    4. 确保两个数组中所有元素全部插入后(n1<0,n2<0),程序结束。
    void Conbine_Array(int *a, int A1_length, int *b, int A2_length)
    {
        int new_length = A1_length + A2_length;
    
        int A1_index = A1_length - 1;
        int A2_index = A2_length - 1;
        int new_index = new_length - 1;
    
        while (A1_index >= 0 || A2_index >= 0)
        {
            if (A1_index >=0&& A2_index >=0)
            {
                if (a[A1_index] >= b[A2_index])
                {
                    a[new_index--] = a[A1_index--];
                }
                else
                {
                    a[new_index--] = b[A2_index--];
                }
            }
            else if (A1_index >= 0)
            {
                a[new_index--] = a[A1_index--];
            }
            else if (A2_index >= 0)
            {
                a[new_index--] = b[A2_index--];
            }
        
        }
    
    }
  • 相关阅读:
    提高Java程序性能的技巧
    HBASE学习d端口master:16010(java操作hbase)https://www.cnblogs.com/junrong624/p/7323483.html
    log4j.properties加入内容
    zookeeper学习及安装
    flume学习以及ganglia(若是要监控hive日志,hive存放在/tmp/hadoop/hive.log里,只要运行过hive就会有)
    Hadoop各个启动流
    crontab基本操作部分
    pig(数据流语言和编译器)学习https://www.w3cschool.cn/apache_pig/apache_pig_execution.html
    pig配置
    hive(在大数据集合上的类SQL查询和表)学习
  • 原文地址:https://www.cnblogs.com/wll-zju/p/4565832.html
Copyright © 2011-2022 走看看