zoukankan      html  css  js  c++  java
  • 算法题:数组合并问题的解法

     描述:有两个有序数组A,B,内存A在A的末尾有足够多的空间容纳B,实现函数:把B中的所有数字插入到A中,并且保持A中的所有数字是排序的。

    解法:

     1 #include<stdio.h> 
     2 #include<string.h>
     3 
     4 void newArray( char stringA[], char stringB[], int length){
     5     if(stringA == NULL && stringB == NULL && length < 0)
     6         return;
     7     
     8     int lengthA = 0;
     9     int lengthB = strlen(stringB);
    10 
    11     int i = 0;
    12     
    13     while(stringA[i] != ''){
    14         ++lengthA;
    15         ++i;
    16     }
    17         
    18     int newLength = lengthA + lengthB;
    19     if(newLength > length)
    20         return;
    21         
    22     int indexofA = lengthA - 1;
    23     int indexofB = lengthB - 1;
    24     int indexNew = newLength - 1;
    25 
    26     while(indexofA >= 0 && indexofB >= 0){
    27         if(stringA[indexofA] > stringB[indexofB]){
    28             stringA[indexNew--] = stringA[indexofA];             
    29             indexofA--;                                     //A数组的索引向前移动一位
    30         }
    31         else{
    32             stringA[indexNew--] = stringB[indexofB];        
    33             indexofB--;                                     //B数组的索引向前移动一位
    34         }
    35     }
    36     
    37 //    printf("%d %d
    ", indexofA, indexofB);
    38     
    39     if(indexofA >= 0){
    40         return;
    41     }
    42     if(indexofB >= 0){                                      //将剩下的B数组中的内容拷贝到A中
    43         while(indexofB >= 0){
    44         stringA[indexNew--] = stringB[indexofB];
    45         indexofB--;
    46         }
    47     }
    48     stringA[newLength + 1] = '';
    49     
    50 }
    51 
    52 int main(){
    53     char str1[20] = {6, 8, 20};
    54     char str2[4] = { 1, 3, 4, 30};
    55     newArray(str1, str2, 20);
    56     int j = 0;
    57     while(str1[j] != ''){
    58         printf("%d  ", str1[j]);
    59         j++;
    60     }
    61     return 0;
    62 }

    算法详解:

    我们知道从头开始进行合并很难实现O(n)级别的算法。但是我们需要转变一下思想就可以实现。即从尾部开始扫描并进行合并。

    我们需要先将两个数组中的元素个数求出来,并且相加得出需要将A数组从哪里开始赋值(假如计算结果是newlength),这样就可以从尾部对两个数组进行比较:将大的数字从newlength开始赋值一直到某一个数组结束(如果B数组到头了,那么算法结束;如果A数组结束而B没有,那么只需要将B数组剩下的数字一一复制到A中剩下的空间即可)。

  • 相关阅读:
    css做中划线与文字排版
    修复ios上第三方输入法弹出时输入键盘盖住网页没有进行相应滚动从而盖住表单输入框的问题
    一般活动页面之类简单的背景图内容布局方式
    compass的使用
    nodejs与sqlite
    ftp命令
    shell变量详解
    Vue CLI 3 使用百度地图
    centos7中安装python3
    redis集群安装问题/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
  • 原文地址:https://www.cnblogs.com/dormant/p/5259709.html
Copyright © 2011-2022 走看看