键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...
一、有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下:
(1) 键盘录入6个int类型的数据存入数组arr中;
(2) 将arr数组中的内容反转;
(3) 将反转后的数组角标为奇数的元素相互交换,即1和3交换,3和5交换,以此类推;
(4) 将数组中最后一个角标为奇数的元素和数组中第一个角标为奇数的元素交换;
(5)打印最终的数组,(实现了1—4步之后的数组)
示例:如用户输入的6个整数为[1,2,3,4,5,6]>[6,5,4,3,2,1]>[6,3,4,1,2,5]>最后输出[6,5,4,1,2,3].
二、问题分析:这是一道整数数组操作的题目,考察对数组基本操作方法的熟练度。如果用JS编程,(2)中反转很容易完成,用Array.prototype.reverse()方法即可;重点在第(3)、(4)步。需要循环数组处理奇数位交换问题。同时要记录下最后一个奇数位的元素索引值(数组下标为奇数的最后一个元素)。
同时,作为程序员分析问题一定要综合考虑所有情况,适当拓展,不能只停留在解决这个示例数组[1,2,3,4,5,6]的问题上,而要把它看成是任意长度的数组。在这里我们就把它当成一个任意长度的数组arr。再依次进行题中的操作。
三、问题解决,JavaScript代码如下:
const getArr = (arr) => {
const arrRe = arr.reverse();//反转数组
console.log('数组反转:', arrRe);
const exchange = (arr, m, n = m + 2) => {//参数n=m+2,含义是如果传入参数n(不能传入undefined)则取传入参数,如果没有传入或者传入undefined(如传入null,会取null不会取m+2)则取m+2.
const vm = arr[m];
arr[m] = arr[n];
arr[n] = vm;//注意此时vm的值还是数组交换前arr[m]的值,不会随数组交换而改变
};
let i = 1;//i定义在外层,作为循环变量的同时,记录最后一个奇数位下标
for (; i + 2 < arr.length; i += 2) {
exchange(arrRe, i);//对数组arrRe循环依次进行奇数位交换操作
}
console.log('奇数位交换:', arrRe);
exchange(arrRe, 1, i);//交换首个奇数位元素和最后一个奇数位元素arrRe[i]
console.log('首个奇数位和最后一个奇数位交换(最终结果):', arrRe);
return arrRe;
};
//运行如下代码:
getArr([1,2,3,4,5,6]);
/*
依次输出:
数组反转: [6, 5, 4, 3, 2, 1]
奇数位交换: [6, 3, 4, 1, 2, 5]
首个奇数位和最后奇数位交换(最终结果): [6, 5, 4, 1, 2, 3]
*/
(本文为原创博客,转载请注明出处:https://www.cnblogs.com/xiao-pengyou/)
注意:数组是引用类型,JS中的Object和Array都是引用类型,即常量arr是指向数组[1,2,3,4,5,6]内存地址的一个指针,所有在数组上的操作都会被自动记录即原数组记录一切改变,数组作为函数传入参数的时候也是传入了数组的引用,故在函数内的操作也会改变原数组或对象,以上代码所有改变arr的操作都作用于arr原数组,指针始终没变。因此进行操作时不必关心如何记录原数组的变化,只需要进行一系列操作最终得到想要的结果即可。
四、数组知识拓展:
如果想要拷贝一个数组,可以使用Array.prototype.concat()或者Array.prototype.slice()实例方法(对象的方法分为实例方法和静态方法,不作详述,网上很多资料可以自行查阅)。示例代码如下:
const arr = [1,2,3];
const arr1 = arr;
const arr2 = [].concat(arr);
const arr3 = arr.slice();//相当于arr.slice(0) arr[0] = 4;
arr1;//[4,2,3]
arr2;//[1,2,3]
arr3;//[1,2,3] //可见数组arr的改变不会影响arr2和arr3.
虽然Array.prototype.concat()或者Array.prototype.slice()拷贝的数组不会受原数组影响,但是它们也不是真正意义上的深拷贝,因为如果数组的某个元素还是引用类型,如[[1,2], 2, 3]用concat()拷贝之后的数组的第一个元素[1,2]还是会受原数组的影响,所以没有真正实现深拷贝,只是一种浅拷贝。深浅拷贝是相对于引用类型。
深拷贝:深度拷贝就是拷贝后的对象和原对象(JS中万物皆为对象,所以此处把引用类型都叫做对象)的内存和以后的操作都互不影响。拷贝的时候为新对象开辟了新的内存而不是拷贝原对象的引用。
浅拷贝:浅拷贝是拷贝原对象的引用,拷贝后的对象和原对象会相互影响。因为引用不变,指针指向的内存地址不变, 任一对象的改变都会引起所有该内存位置对应对象的改变。
注:
基本类型,存放在栈(stack,类似数据结构中的栈)中(编译器自动分配释放),
引用类型,值大小不固定,在栈内存中存一个基本类型值保存对象在堆(heap,不是数据结构中的堆,分配方式类似数据结构中的链表)内存中的地址,用于引用这个对象。
基本类型在执行环境结束时被销毁,而引用类型不会随执行环境结束而销毁,只有当所有引用它的变量不存在时这个对象才被垃圾回收机制回收,也可以由程序员分配释放。
篇幅有限就不再跑题了,关于基本类型、引用类型、堆栈等概念请自行查阅资料。
本文为原创博客,严禁非法抄袭或复制,转载请注明出处:https://www.cnblogs.com/xiao-pengyou/
键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...的更多相关文章
- 两个int类型的数据相加,有可能会出现超出int的表示范围。
两个int类型的数据相加,有可能会出现超出int的表示范围. /* 移位运算符: <<(左移) 规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移 的位数. ...
- java 两个int类型的数据相除并输出百分号保留两位有效数字
java代码: public void IntA(int a , int b){ //首先判断分母不能为0 if(b!=0){ folat num = (float) a*100/b; Decimal ...
- 对int类型的数据,如何让获取长度
下面为大家写一个列子 int a = 124;<br> Integer a1 = a;//转换为包装类Integer<br> System.out.println(a1.t ...
- 在java中使用Mysql数据库,如何在MyBatis的xml里面处理时间为Int类型的数据
主要是将显示在页面上的数据变成日期格式,而不是相应的毫秒数,具体的做法如下: 1.首先需要在相关的xml文件里面修改时间为下面语句,其中reg_time为要修改的日期列名 FROM_UNIXTIME( ...
- 为什么int类型的数据可以存储超过9999?
int占4字节,4*8=32位,10进制取值范围为 (-2^31-1)~(2^31-1):-2147483648~2147483647 package test; public class test1 ...
- 枚举类型的数据存入到map中
阅读更多 原文来自http://fokman.iteye.com/blog/1568905 public enum IdeasCMD { RESERVED(0), PING(1), PING_ACK( ...
- 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式
package com.loaderman.test; import java.math.BigDecimal; import java.math.BigInteger; import java.ut ...
- 使用DataOutputStream写入int类型数字不能显示
前段时间做Android系统项目需要使用DataOutputStream数据流向文件里写入数据,写入的有String类型和int类型.写入之后在代码中使用DataInputStream读出是没有问题的 ...
- println()函数输出int类型返回值错误的问题
out.println(); 在用这个语句输出其他类返回大的int类型的数据的时候,注意输出错误. 例如: out.println(class1.方法()): 导致错误: our.println(c ...
随机推荐
- Python基础-列表生成式和生成器表达式
一.列表生成式(List Comprehension) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list ...
- iOS线程和进程的区别和联系
线程和进程的区别主要在于它们是不同的操作系统资源管理方式.进程有独立的地址空间,一个进程崩溃后,在保护模式的影响下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径.线程有自己的堆栈和局部变量 ...
- Perl学习笔记(2)----正则表达式数字匹配的一个疏忽
<Perl语言入门>第15章习题第2题如下: 用 given-when 结构写一个程序,根据输入的数字,如果它能被3整除,就打印“Fizz”:如果它能被5整除,就打印“Bin”:如果它能被 ...
- WinAPI: OpenProcess、GetExitCodeProcess、TerminateProcess (测试强制关闭 OICQ)
原文:http://www.cnblogs.com/del/archive/2008/03/10/1098502.html //声明: {返回进程的句柄} OpenProcess( dwDesir ...
- [MFC]选择目录对话框和选择文件对话框
在MFC编程中经常会需要用到选择目录和选择文件的界面,以下总结一下本人常用的这两种对话框的生成方法: 选择目录对话框 //选择目录按钮void CDcPackerDlg::OnBnClickedDec ...
- PHP | 别家网站都有的登录功能,你的网站也可以有!
如果说一个网站是一个独立的王国,那登录功能就相当于这个[王国]的大门.进出往来的人必须要通过这道[门]才能进出这个[王国],这样才能有效的达到对人流量和用户的有效监管,也可以进一步了解每个用户的喜好, ...
- 【NLP_Stanford课堂】语言模型4
平滑方法: 1. Add-1 smoothing 2. Add-k smoothing 设m=1/V,则有 从而每一项可以跟词汇表的大小相关 3. Unigram prior smoothing 将上 ...
- 前后端分离, 前端如何防止直接输入URL进入页面?
转自:https://blog.csdn.net/weixin_41829196/article/details/80444870 前后端分离,如何防止用户直接在地址栏输入url进入页面,也就是判断用 ...
- VS配置Qt
https://blog.csdn.net/qq_35488967/article/details/71516640
- easyui学习笔记1—增删改操作
最近公司要用easyui,这里自己看了官网几篇文章,遇到些问题,大多数的问题都是敲代码的时候笔误,其他有些地方确实需要注意一下,这里做些笔记. 1.在mysql中建好表之后修改id字段为递增字段,发现 ...