键盘录入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/

原文地址:https://www.cnblogs.com/xiao-pengyou/p/10630072.html

时间: 2024-10-14 10:33:57

键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...的相关文章

将字符串数据转为一个int类型的数组的方法

将某列int类型的数据转成一个字符串的方法,如: 现有一张表UserInfo(userId,userName) userId     userName E001                sa E002                张三 E003               刘丽 现要实现的功能是将userId使用“,”来进行一下拼接,返回的结果为:E001,E002,E003,其实现的方法 DECLARE @manageAreaName VARCHAR(100)set @manageAr

使用DataOutputStream写入int类型数字不能显示

前段时间做Android系统项目需要使用DataOutputStream数据流向文件里写入数据,写入的有String类型和int类型.写入之后在代码中使用DataInputStream读出是没有问题的,处于好奇心就把生成的文件导出来查看了一下. 打开之后发现,生成的文件里有一堆乱码,除了一些String类型的数据,其他都是乱码.当时第一反应应该是编码格式的问题,应为DataOutputStream里有writeUTF之类的方法,相当于指定的编码格式,于是我就把打开格式切换成各种编码格式,utf8

5A rrai类型?数组可以保管恣意类型的数据

经过把基类的目标赋给子类的prototyp即可模仿面向目标中的承继联系.另一种完结承继的办法叫"目标假充"即凭借call办法.call调用一个目标的一个办法,以另一个目标更换当前目标. 5A rrai类型?数组每一项可以保管恣意类型的数据,且巨细动态调整.数组还可以表明得像栈一样,有push和pop办法.重排序办法:revers和sort数组界说了5种迭代办法:?everifilterforeachmapsome迭代办法都接纳两个参数:每一项上运转的函数和效果域目标(可选)6函数用fu

从0开始学大数据-Java基础-三元运算符/键盘录入(4)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节了解Java运算符,其中三元运算符没有做讲解,本节我们开始学习Java基础-三元运算符/键盘录入,将会围绕以下几个知识点进行展开学习: 三元运算符 键盘录入数据 一.运算符 1.三元运算符 接着上一节的话题运算符,本节讲三元运算符,在讲三元运算符之前,可能会有很多朋友会问,是不是有一元运

键盘录入两个数据,比较两个是否相等 ,用方法改进

package wac.wev.LianXi; import java.util.Scanner; //需求:键盘录入两个数据,比较两个是否相等 ,用方法改进public class FunctionDemo {public static void main(String[] args){//创建键盘录入对像Scanner sc = new Scanner(System.in);//第一个数据System.out.println("请输入第一个数据");int a= sc.nextIn

键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:&quot;java&quot;,&quot;txt&quot;)作为key, 用个数作为value,放入到map集合中,遍历map集合

package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Scanner;import java.util.Set; /** 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt&qu

Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例

1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: 1 package com.himi.updDemo1; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 import java.util.Scanner; 8 9 /** 10 * 11

键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值

package cn; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; /**  * 键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值  * 分析:  *  1.创建键盘录入对象  *  2.键盘录入多个数据,我们不知道有多少个,所以用集合存储  *  3.以0结束,只要键盘录入的数据是0,就退出循环  *      4.把集合转换成数组  *      5.对数组进行排

Java基础知识强化之集合框架笔记36:List练习之键盘录入多个数据在控制台输出最大值

1. 键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值 分析: •  创建键盘录入数据对象 •  键盘录入多个数据,我们不知道多少个,所以用集合存储 •  以0结束,这个简单,只要键盘录入的数据是0,我就不继续录入数据了 •  把集合转成数组 •  对数组排序 •  获取该数组中的最大索引的值 2. 代码实现: 1 1. package cn.itcast_03; 2 3 import java.util.ArrayList; 4 import java.util.Arrays;