【LintCode题集】Q6、Q64

  最近开始刷LintCode上的题目,先从标签为容易的开始刷。今天刷的这两题目差不多为同一类型的题目,都是为按照一定的规则合并两个已经有序的数组。

  

[Q6]

描述:

  合并两个排序的整数数组A和B变成一个新的数组。

  样例:

  给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]

思路:

  题目的方法原型为:

1 public int[] mergeSortedArray(int[] A, int[] B) {}

  所以即从A和B数组中一次取数比较大小,将其中较小者放入新的数组C。

  当其中一个数组已经全部取出,则将剩余一个数组中的数全部放入数组C中。

  在归并排序中,当把一个序列分解为若干个子序列之后,正是通过递归的合并子序列来完成排序。

实现:

 

 1 public int[] mergeSortedArray(int[] A, int[] B) {
 2         // Write your code here
 3 
 4         int[] C = new int[A.length + B.length];
 5 
 6         int indexa = 0;  //表示a数组的索引位置
 7         int indexb = 0;  //表示b数组的索引位置
 8         int indexc = 0;  //表示c数组的索引位置
 9 
10         //当某个数组已经全部合并进新的数组的时候跳出循环
11         while( ! ((indexa == A.length) || (indexb == B.length))){
12             if(A[indexa] <= B[indexb]){
13                 C[indexc ++] = A[indexa ++];
14             }
15             else{
16                 C[indexc ++] = B[indexb ++];
17 
18             }
19         }
20         //A数组还有剩余元素
21         while(indexa < A.length){
22             C[indexc ++] = A[indexa ++];
23         }
24         //B数组还有剩余元素
25         while(indexb < B.length){
26             C[indexc ++] = B[indexb ++];
27         }
28 
29         return C;
30 
31 }

 

[Q64]

描述:

  合并两个排序的整数数组A和B变成一个新的数组。

  你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。

  样例:

  给出 A = [1, 2, 3, empty, empty], B = [4, 5]

  合并之后 A 将变成 [1,2,3,4,5]

思路:

  题目的方法原型为:

1 public void mergeSortedArray(int[] A, int m, int[] B, int n) {}

 

  从题目函数原型和题目描述可以看出,这次在合并的时候是在A数组的基础上进行合并,A数组的大小大于或等于A+B的大小,所以可以将B数组合并到A数组中。

  考虑两种情况:

  1 当B中的某个元素已经比A中的最后一个元素还要大时,此时不需要再继续比较了,直接将B中包括当前元素的剩余元素全部插入到A数组最后。

  2 当B中的第x元素通过比较插入到了A数组的y位置上,则第x + 1 元素直接从y + 1 位置开始继续比较,前面的无需比较。

  此题目比上面的题目还要多增加一个步骤,因为是在A数组上进行插入,所以插入之后,插入位置以后的元素需要往后移动一个位置,涉及到一个移动操作。

实现:

 1  public void mergeSortedArray(int[] A, int m, int[] B, int n) {
 2         int indexa = 0 ;   //  标识A数组的遍历位置
 3         int indexb = 0 ;   //标识B数组的遍历位置
 4         int lastIndex = m - 1  ;  //标识A数组中最后的位置
 5 
 6         while ( (indexa <= lastIndex) && (indexb <= n - 1) ) {
 7             if(B[indexb] < A[indexa]){
 8                 //这个题目第一此提交出现了错误, 错误原因是下面的for循环中应该是i -- ,  手滑写成了 i ++
 9                 for(int i = lastIndex ; i >= indexa ; i --){
10                     A[i + 1] = A [i] ;
11                 }
12                 A[indexa ++] = B[indexb ++];
13                 lastIndex ++ ;
14             }
15             else{
16                 indexa ++ ;  
17             }
18         }
19         while(indexb <= n - 1 )  {
20             A[++ lastIndex] = B[indexb ++] ;
21         }
22 }

 

总结:

  有关于数组的操作,大多可以用过设置不同变量,来标识数组中的不同位置,从而可以进行不同的操作。

 

转载于:https://www.cnblogs.com/tancky/p/6574747.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

input标签的值只能两位小数_解决input只能输入金额类型的方案(金额输入框只能输入2位小数)...

欢迎加我技术交流QQ群 &#xff1a;811956471前言&#xff1a;最近在用uni-app框架&#xff0c;写一个项目(支付宝和微信小程序)遇到一个需求&#xff0c;要求金额输入框只能输入2位小数&#xff0c;且第一位数不能是 "."&#xff0c;只能是数字。发现用 input事件监…

C# winform中判断控件类型

C# winform中对控件类型的判断&#xff1a; public void UpdataControl(Control control, string data) {if (control is TextBox){doSomething1();}if (control is Label){doSomething1();}if (control is Button){doSomething1();}}

单元测试原来是这样的呼

我们要先创建一个界面&#xff1a; 显示的界面是这样的&#xff1a; 接下来我们来写java代码&#xff0c; 在输入框里的内容&#xff0c;点击button&#xff0c;将数据显示到上面的textview. 后面写测试用例&#xff0c;但我不知道哪里出错了&#xff0c;不知道是不是创建就出错…

python生成表达式_说说 Python 的生成器表达式

列表推导与生成器表达式都可以用于初始化元组、数组或其他类型的序列。但列表推导需要先建立一个完整的列表&#xff0c;然后再把这个列表传递到某个构造函数。而生成器表达式会逐个产出元素&#xff0c;这样显然能够节省内存。列表推导写法&#xff1a;codes [ord(symbol) fo…

C#中宏定义#define、预处理#if #else #endif的使用

C#中预处理的使用&#xff1a; 预处理指令并不会被编译为执行代码中的指令&#xff0c;但使用预处理指令可以选择编译程序中的哪部分代码。一般在调试代码时或在发布不同功能等级的软件版本中使用。 需要特别注意的是&#xff0c;宏定义必须在C#的.cs源文件最开头的位置定义&am…

华硕vm510l装固态硬盘_华硕VM510L拆机换固态硬盘

首先看下需要准备的东西&#xff0c;一台华硕笔记本&#xff0c;螺丝刀&#xff0c;固态硬盘。微信图片_201910051157221.jpg1.先把背面的螺丝全部卸掉。微信图片_20191005115722.jpg2.反过来&#xff0c;暴力拆键盘&#xff0c;从边缘部分开始撬。注意键盘下面有排线&#xff…

C# 串口接收1次数据会进入2次串口接收事件serialPort1_DataReceived,第2次进入时串口缓冲区为空

在C#中使用串口接收数据时发现&#xff0c;在完整的接收完一次数据后&#xff0c;还会再次进入串口接收事件。 在网上搜索资料发现其他开发者也有遇到该问题&#xff1a; [1] c#串口事件接受一次数据莫名其妙会触发两次 原文链接&#xff1a;https://www.52pojie.cn/threa…

js里的面向对象分析-(创建实例化对象)

ECMAScript 有两种开发模式&#xff1a;1.函数式(过程化)&#xff0c;2.面向对象(OOP)。面向对象的语言有一个标志&#xff0c;那就是类的概念&#xff0c;而通过类可以创建任意多个具有相同属性和方法的对象。但是&#xff0c;ECMAScript 没有类的概念&#xff0c;因此它的对象…

swift 隐藏状态栏_如何在Swift iOS应用中隐藏状态栏?

我想删除屏幕顶部的状态栏。这不起作用&#xff1a;func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: NSDictionary?)-> Bool{application.statusBarHidden truereturn true}我也尝试过&#xff1a;func application(applicati…

C#控件跨线程内容更新

在使用C#开发winform应用程序时&#xff0c;经常会碰到对控件跨线程访问造成的异常。在winform中UI线程和工作线程是分开的&#xff0c;但在实际使用中经常会需要在工作线程更新UI线程中创建的控件。 方法1&#xff1a;禁用跨线程访问控件检测 .NET默认开启了禁止跨线程控件访…

document.addeventlistener方法不执行_JUnit 5 测试方法的执行优先级

前言使用单元测试有时对方法的执行顺序有要求&#xff0c;而默认情况下测试方法的执行并非按照编写顺序&#xff0c;这就导致测试用例因执行顺序而导致的不通过。这里我使用的JUnit版本是5.6.2&#xff0c;下面讲述如何自定义测试方法的执行优先级。TestMethodOrder这个注解标注…

2异常处理_Java处理异常2种机制关键字区别解析

在异常处理的过程中,throws和throw的区别是?throws:是在方法上对一个方法进行声明,而不进行处理,而是向上传,谁调用谁处理.throw:是在具体的抛出一个异常类型.throws的栗子:throws的话,就是这个方法有可能会产生异常,而我只是将它声明出去,我自己不处理,如果有人调用的时候,可…

Scrapy——1

python3安装scrapy:http://www.cnblogs.com/Wananbo/p/6093969.html 运行scrapy时&#xff0c;弹出win32错误&#xff0c;然后用pip install pywin32 不行&#xff0c;实际上是缺少了pypiwin32转载于:https://www.cnblogs.com/tangbinghaochi/p/6593543.html

TL431的用法

TL431是可控精密稳压源。它的输出电压用两个电阻就可以设置从Vref&#xff08;2.5V&#xff09;到36V范围内的任何值。该器件的典型动态阻抗为0.2Ω&#xff0c;在很多应用中用它代替稳压二极管&#xff0c;例如&#xff0c;数字电压表&#xff0c;运放电路&#xff0c;可调压电…

个人作业2——英语学习APP的案例分析

产品&#xff1a;必应词典Android客户端 第一部分 调研&#xff0c; 评测 1、第一印象 一款app给人带来的第一印象&#xff0c;一是图标二是界面。微软必应词典的图标好似一本书&#xff0c;好看简洁又与词典相呼应&#xff0c;好评。二来其界面打开也很清爽&#xff0c;每日一…

AD16原理图.schdot中批量修改标签中的文本字体、大小、颜色

1&#xff09;使用鼠标左键区域选中需要修改的文本&#xff0c;或按住shift键使用鼠标左键选择分布在图中各处的需要修改的文本 2&#xff09;按住shift键&#xff0c;鼠标左键双击选中的任一文本&#xff0c;弹出如下的SCH Inspector弹窗 3&#xff09;在SCH Inspector弹窗中…

12v小型电机型号大全_鄂破碎机型号大全图,小型鄂破碎机价格

鄂破碎机&#xff0c;粗碎加工主力配置&#xff0c;因为使用频繁&#xff0c;很多案例都少不了&#xff0c;所以设备生产厂家有很多&#xff0c;但是随时鄂破碎机的机型更新&#xff0c;核心性能越来越完善&#xff0c;整机时产更高&#xff0c;而且环保性能更强悍。鄂破碎机型…

我的第一次Pascal程序

今天刚刚来学点Pascal语言&#xff0c;都怪我买的书大多是用Pascal语言写的&#xff0c;所以我只能试着学一点咯&#xff01; 来一段程序员最经典的Hello World&#xff01; 1 program exl_2; 2 begin 3 write(Hello World!); 4 end. 转载于:https://www.cnblogs.com/ECJTU…

C#中的前台线程和后台线程的区别

前台线程&#xff1a;应用程序必须运行完所有的前台线程才能退出&#xff0c;默认创建的线程都是前台线程。 后台线程&#xff1a;应用程序可以不必考虑后台线程是否已经运行完毕&#xff08;包括正常退出和异常退出&#xff09;&#xff0c;只要所有的前台线程结束&#xff0…

jenkins执行bat失败_关于批处理文件:即使在BAT脚本中成功执行了ROBOCOPY命令,JENKINS作业也会失败...

我正在通过詹金斯执行Windows蝙蝠脚本。 批处理文件正在提供所需的输出&#xff0c;但是构建失败。我的批处理文件是..cd /d D:\\Bank\\Member\\IDif %errorlevel% neq 0 exit /b %errorlevel%mkdir OTPif %errorlevel% neq 0 exit /b %errorlevel%robocopy C:\Corporate D:\\B…