48. 旋转图像----从一道题中深入理解数组=

news2024/11/18 13:44:40

48. 旋转图像

  • 原题链接:
  • 完成情况:
  • 开始分析:
    • (1)
    • (2)
    • (3)
  • 解释:
    • 如果是一维数组
    • 如果是二维数组
    • 数组传递的底层原理

原题链接:

48. 旋转图像
https://leetcode.cn/problems/rotate-image/

完成情况:

在这里插入图片描述

package 西湖算法题解___中等题;

public class __48旋转图像 {
	/**
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		int [][] matrix ={{1,2,3},{4,5,6},{7,8,9}};
		rotate(matrix);
		for (int i = 0; i < matrix.length; ++i) {
			for (int j = 0; j < matrix.length; ++j) {
				System.out.print(matrix[i][j]+" ");
			}
			System.out.println();
		}
	}

	/**
	 * @param matrix
	 * @return
	 */
	public static void rotate(int[][] matrix){
		int helper[][] = new int[matrix.length][matrix.length];
		//int helper[][] = matrix;
		for (int i=0;i< matrix.length;i++){ //针对matrix来说,i是列
			int temp=0;
			for (int j= matrix.length-1;j>=0; j--){ //则对应j是行
				//System.out.println("当前的matirx是:"+matrix[j][i]+"\t当前取得j和i分别为:"+j+" "+i);
				helper[i][temp] = matrix[j][i];
				temp++;
			}
			//System.out.println();
		}

		for (int i = 0; i < matrix.length; ++i) {
			for (int j = 0; j < matrix.length; ++j) {
				matrix[i][j] = helper[i][j];
			}
		}
		//matrix = helper;


	}//public void rotate(int[][] matrix)
}

开始分析:

(1)

在这里插入图片描述

package 西湖算法题解___中等题;

public class __48旋转图像 {
	/**
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		int [][] matrix ={{1,2,3},{4,5,6},{7,8,9}};
		rotate(matrix);
		for (int i = 0; i < matrix.length; ++i) {
			for (int j = 0; j < matrix.length; ++j) {
				System.out.print(matrix[i][j]+" ");
			}
			System.out.println();
		}
	}

	/**
	 * @param matrix
	 * @return
	 */
	public static void rotate(int[][] matrix){
		int helper[][] = new int[matrix.length][matrix.length];
		//int helper[][] = matrix;
		for (int i=0;i< matrix.length;i++){ //针对matrix来说,i是列
			int temp=0;
			for (int j= matrix.length-1;j>=0; j--){ //则对应j是行
				//System.out.println("当前的matirx是:"+matrix[j][i]+"\t当前取得j和i分别为:"+j+" "+i);
				helper[i][temp] = matrix[j][i];
				temp++;
			}
			//System.out.println();
		}

//		for (int i = 0; i < matrix.length; ++i) {
//			for (int j = 0; j < matrix.length; ++j) {
//				matrix[i][j] = helper[i][j];
//			}
//		}
		matrix = helper;


	}//public void rotate(int[][] matrix)
}

(2)

在这里插入图片描述

做个Test看看:
在这里插入图片描述

(3)

在这里插入图片描述

package 西湖算法题解___中等题;

public class __48旋转图像 {
	/**
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		int [][] matrix ={{1,2,3},{4,5,6},{7,8,9}};
		rotate(matrix);
		for (int i = 0; i < matrix.length; ++i) {
			for (int j = 0; j < matrix.length; ++j) {
				System.out.print(matrix[i][j]+" ");
			}
			System.out.println();
		}
	}

	/**
	 * @param matrix
	 * @return
	 */
	public static void rotate(int[][] matrix){
		int helper[][] = new int[matrix.length][matrix.length];
		//int helper[][] = matrix;
		for (int i=0;i< matrix.length;i++){ //针对matrix来说,i是列
			int temp=0;
			for (int j= matrix.length-1;j>=0; j--){ //则对应j是行
				//System.out.println("当前的matirx是:"+matrix[j][i]+"\t当前取得j和i分别为:"+j+" "+i);
				helper[i][temp] = matrix[j][i];
				temp++;
			}
			//System.out.println();
		}
//		for (int i = 0; i < matrix.length; ++i) {
//			for (int j = 0; j < matrix.length; ++j) {
//				System.out.print(helper[i][j]+" ");
//			}
//			System.out.println();
//		}

//		for (int i = 0; i < matrix.length; ++i) {
//			for (int j = 0; j < matrix.length; ++j) {
//				matrix[i][j] = helper[i][j];
//			}
//		}
		matrix = helper;
		for (int i = 0; i < matrix.length; ++i) {
			for (int j = 0; j < matrix.length; ++j) {
				System.out.print(helper[i][j]+" ");
			}
			System.out.println();
		}
		System.out.println("--------------------------------------------------");
		for (int i = 0; i < matrix.length; ++i) {
			for (int j = 0; j < matrix.length; ++j) {
				System.out.print(matrix[i][j]+" ");
			}
			System.out.println();
		}


	}//public void rotate(int[][] matrix)
}

解释:

在这里插入图片描述

如果是一维数组

在Java中,一维数组采用=进行赋值操作时,将会发生以下情况:

  1. 数组引用的传递:如果将一个已存在的数组赋值给另一个数组变量,那么实际上是将数组的引用(内存地址)传递给了新的数组变量。这意味着两个数组变量将引用同一个数组对象。对其中一个数组的修改会影响另一个数组。
int[] array1 = {1, 2, 3};
int[] array2 = array1;  // 数组引用的传递,array2引用了同一个数组对象

array2[0] = 100;
System.out.println(array1[0]);  // 输出: 100

在上述示例中,array2通过赋值操作引用了array1指向的数组对象。修改array2[0]的值也会影响到array1[0],因为它们指向同一个数组对象。

  1. 数组的复制:如果将一个数组复制给另一个数组,那么会创建一个新的数组对象,并将原数组的值复制到新数组中。这样,两个数组变量引用的是两个独立的数组对象,修改其中一个数组不会影响另一个数组。
int[] array1 = {1, 2, 3};
int[] array2 = new int[array1.length];
System.arraycopy(array1, 0, array2, 0, array1.length);  // 数组的复制

array2[0] = 100;
System.out.println(array1[0]);  // 输出: 1

在上述示例中,使用System.arraycopy方法将array1的值复制到了新的数组array2中。修改array2[0]的值不会影响到array1[0],因为它们引用的是两个不同的数组对象。

总结:一维数组的赋值操作涉及到数组引用的传递或数组的复制,具体取决于赋值语句的上下文和操作的方式。

如果是二维数组

在Java中,二维数组采用=进行赋值操作时,会发生以下情况:

  1. 数组引用的传递:如果将一个已存在的二维数组赋值给另一个二维数组变量,实际上是将二维数组的引用(内存地址)传递给了新的数组变量。这意味着两个数组变量将引用同一个二维数组对象。对其中一个数组的修改会影响另一个数组。
int[][] array1 = {{1, 2}, {3, 4}};
int[][] array2 = array1;  // 数组引用的传递,array2引用了同一个二维数组对象

array2[0][0] = 100;
System.out.println(array1[0][0]);  // 输出: 100

在上述示例中,array2通过赋值操作引用了array1指向的二维数组对象。修改array2[0][0]的值也会影响到array1[0][0],因为它们引用同一个二维数组对象。

  1. 数组的复制:如果将一个二维数组复制给另一个二维数组,会创建一个新的二维数组对象,并将原数组的值复制到新数组中。这样,两个数组变量引用的是两个独立的二维数组对象,修改其中一个数组不会影响另一个数组。
int[][] array1 = {{1, 2}, {3, 4}};
int[][] array2 = new int[array1.length][array1[0].length];
for (int i = 0; i < array1.length; i++) {
    System.arraycopy(array1[i], 0, array2[i], 0, array1[i].length);
}  // 数组的复制

array2[0][0] = 100;
System.out.println(array1[0][0]);  // 输出: 1

在上述示例中,通过循环和System.arraycopy方法将array1的值复制到了新的二维数组array2中。修改array2[0][0]的值不会影响到array1[0][0],因为它们引用的是两个不同的二维数组对象。

总结:二维数组的赋值操作涉及到数组引用的传递或数组的复制,具体取决于赋值语句的上下文和操作的方式。

数组传递的底层原理

在Java中,数组是按值传递的,而不是按引用传递。当将数组作为参数传递给函数时,函数接收到的是原始数组的一个副本,而不是对原始数组的引用。因此,对函数内部对数组进行的修改操作不会影响原始数组。

当你传递数组给函数时,实际上是将数组的副本传递给了函数。这意味着函数内部对数组进行的修改只会影响到副本,而不会影响原始数组。

public static void modifyArray(int[] arr) {
    arr[0] = 100;  // 修改数组的第一个元素
}

public static void main(String[] args) {
    int[] array = {1, 2, 3};
    modifyArray(array);
    System.out.println(array[0]);  // 输出: 1,原始数组没有被修改
}

在上述示例中,modifyArray函数接收一个整型数组作为参数,并将数组的第一个元素修改为100。然而,在主函数中调用modifyArray后,输出的结果仍然是1,原始数组并没有被修改。这是因为传递给modifyArray的是数组的副本,函数内部的修改只影响到副本,不会影响到原始数组。

如果你希望函数能够修改原始数组,可以通过返回值或者使用其他方法来实现。例如,可以让函数返回修改后的数组,并在主函数中将原始数组替换为返回的数组。

public static int[] modifyArray(int[] arr) {
    arr[0] = 100;  // 修改数组的第一个元素
    return arr;
}

public static void main(String[] args) {
    int[] array = {1, 2, 3};
    array = modifyArray(array);
    System.out.println(array[0]);  // 输出: 100,原始数组被修改
}

在这个示例中,modifyArray函数同样修改了数组的第一个元素,但是它将修改后的数组作为返回值返回,并在主函数中将原始数组替换为返回的数组。这样,主函数中的array引用就指向了修改后的数组,原始数组被成功地修改了。

总结:数组在函数调用后不会记录到修改数组的操作,是因为数组在函数调用时按值传递,函数接收到的是原始数组的副本。如果你想在函数中修改原始数组,可以通过返回值或者其他方式来实现。

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

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

相关文章

【产品设计】电商类产品搜索功能如何优化?

搜索功能对于电商类产品而言尤为重要&#xff0c;当用户带着明确的目的去搜索自己需要的产品时&#xff0c;却没有得到他想要的结果&#xff0c;这在很大程度上直接影响了用户对于产品的体验。本文作者结合自己的经验&#xff0c;来探讨关于电商类产品搜索功能应如何优化。 在讲…

kettle之数据库连接-Generic database连接hive(CDH版)

版本&#xff1a;kettle7.1、hive-common-1.1.0-cdh5.5.0 目录 1、创建连接 2、org/apache/thrift/TException 3、org.apache.hadoop.conf.Configuration 1、创建连接 当我们想通过jdbc方式连接hive时&#xff0c;可以配置一个通用的一般数据连接Generic database&#xff…

理解GPT-4:人工智能的全新里程碑及其国内使用

在人工智能领域&#xff0c;每一代的进步都是突破性的。近年来&#xff0c;这个领域的发展尤为引人注目&#xff0c;尤其是在语言处理和生成方面。OpenAI的GPT系列模型就是最好的例证。在GPT-3取得巨大成功后&#xff0c;我们迎来了更强大的GPT-4。 GPT-4: AI的新里程碑 GPT-4…

【2022吴恩达机器学习课程视频翻译笔记】2.2监督学习-part-2

B站上面那个翻译我有点看不懂&#xff0c;打算自己啃英文翻译了&#xff08;有自己意译的部分&#xff09;&#xff0c;然后懒得做字幕&#xff0c;就丢在博客上面了&#xff0c;2.2之前的章节结合那个机翻字幕能看懂 2.2监督学习-part-2 So supervised learning algorithms …

【qiankun】前端微服务架构踩坑记录

目录 前言 1.Cannot GET /cooperation/board 场景&#xff1a; 分析 解决 2.Invalid options in vue.config.js:"css.requireModuleExtension" is not allowed 原因 解决 3.less版本升级导致除法写法未转换 原因 解决 4.主子应用样式隔离 场景 解决 5…

HOT23-反转链表

leetcode原题链接&#xff1a;反转链表 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输…

Spring Boot 中的缓存注解

Spring Boot 中的缓存注解 在 Spring Boot 中&#xff0c;缓存是一个非常重要的话题。当我们需要频繁读取一些数据时&#xff0c;为了提高性能&#xff0c;可以将这些数据缓存起来&#xff0c;避免每次都从数据库中读取。为了实现缓存&#xff0c;Spring Boot 提供了一些缓存注…

电脑大文件夹怎么加密?大文件夹方法介绍

当我们把电脑中的各种数据分类存放在文件夹中时&#xff0c;可以方便我们使用和管理。但这些文件夹也会变得十分庞大&#xff0c;如果想要加密它们&#xff0c;就需要使用更快速、安全的方法。下面我们来了解一下电脑大文件夹的加密方法。 文件夹加密超级大师 文件夹加密超级大…

享元模式的学习与使用

1、享元模式的学习 当我们需要创建大量相似的对象时&#xff0c;享元模式&#xff08;Flyweight Pattern&#xff09;可以提供一种有效的解决方案。享元模式旨在通过共享对象来最小化内存使用和提高性能。它将对象分为可共享的内部状态&#xff08;Intrinsic State&#xff09;…

websocket前端的连接与接收数据

什么是websocket 1, WebSocket是一种用于在客户端和服务器之间进行全双工通信的网络协议。它使得在单个TCP连接上可以进行双向通信&#xff0c;允许服务器主动地发送数据给客户端&#xff0c;同时客户端也可以向服务器发送数据。与传统的HTTP请求-响应模型不同&#xff0c;Web…

百度排名代发收录怎么上百度

百度排名代发收录怎么上百度&#xff0c;如何提高百度排名&#xff0c;网站提高排名最新手册&#xff01;#seo 今天来点不一样的&#xff0c;就是讲一下百度竞价里边最基础也是最容易踩的一个坑&#xff0c;就是我发现很多人很喜欢把自己推广的产品或者说业务直接作为关键词上…

OpenAI 发布的新语音系统Whisper能力到底有多强?

OpenAI 最近发布了一个名为Whisper 的自动语音识别系统&#xff0c;声称其在英语语音识别方面已经接近人类水平的鲁棒性和准确性。这个系统使用了68万小时多任务监督数据来进行训练&#xff0c;并且在处理口音、背景噪音和技术语言等复杂场景时表现出了很好的鲁棒性。那么&…

s3 删除事故?

起因 一次巡检s3备份查看时, 一回车手滑,出现了下面这种画面,生产事故?!!! 现象 aws s3 rm s3://gfai-hk/upload.cmd 证实的确被删除了,推断后面的生产数据也被全删, 尝试用s3命令恢复发现需要该对象开启版本控制, rm被删除才有可能找回,否则永久删除于是尝试下面的命令 先…

跟着李沐学AI(动手学深度学习 PyTorch版)学习笔记——02深度学习介绍

1.课程安排大概共34天的课-&#xff08;计划7月底看完&#xff0c;争取做到最少两天一更&#xff09; 2.动手学深度学习课本教材 3.课程谈论坛 4.pytorch论坛 一、 目标 二、内容 三、 学习目标&#xff1a; 四、简单了解深度学习 深度学习&#xff1a; 图片分类物体的检测和…

华为OD机试真题 Python 实现【区间连接器】【2023Q1 200分】,附详细解题思路

一、题目描述 有一组区间 [a0, b0], [a1, b1], … (a, b 表示起点, 终点)&#xff0c;区间有可能重叠、相邻&#xff0c;重叠或相邻则可以合并为更大的区间&#xff1b; 给定一组连接器[x1, x2, x3, …]&#xff08;x 表示连接器的最大可连接长度&#xff0c;即 x>gap&…

python网络编程笔记(一)

一&#xff1a;Socket简介 套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即人们所说的BSD Unix。因此,有时人们也把套接字称为“伯克利套接字"或"BSD套接字”。一开始,套接字被设计用在同 -台主机上多个应用程序之间的通讯BSD Socket接口是TCP/IP网…

ArcMap发布arcgis sever缓存瓦片服务

1.全能电子地图下载瓦片地图 2.地图拼接 acrgis sever缓存瓦片 下载完成的文件目录 3.arcMap添加数据 连接本地文件 这一步有坑&#xff0c;一定要加载到瓦片最外层目录&#xff0c;否则看不到图层文件。 找到图层数据&#xff0c;点击添加 添加数据完成&#xff0c;开始发布服…

数字化和物联网的发展如何改变我们的生活方式?

数字化和物联网 (IoT) 的发展已经给我们的生活方式带来了重大变化&#xff0c;而且这些变革将在未来继续发生。以下是数字化和物联网影响我们生活的一些方式&#xff1a; 连接设备和智能家居&#xff1a;物联网使日常物品能够连接到互联网并相互通信。这种连通性允许创建智能家…

记录一次oracle报错IMP-00058: 遇到 ORACLE 错误 904 ORA-00904: “xxx“: 标识符无效

错误原因&#xff1a;导入的表中缺少DATASRC字段 解决方法&#xff1a;在要导入的表中加上DATASRC字段

对 React 状态管理的理解及方案对比

1、React 状态、通信 React 为什么需要状态管理 React 特点&#xff1a; 专注 view 层&#xff1a;专注 view 层 的特点决定了它不是一个全能框架&#xff0c;相比 angular 这种全能框架&#xff0c;React 功能较简单&#xff0c;单一。UIrender(data)UIrender(data)&#x…