(c语言程序执行结果分析题)按行优先的方式把一个二维数组的元素存入一个一维数组中,并输出?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(c语言程序执行结果分析题)按行优先的方式把一个二维数组的元素存入一个一维数组中,并输出?相关的知识,希望对你有一定的参考价值。

#include <stdio.h>

#include <malloc.h>

int main()

    //这是一个二维数组

    int arr[2][3] =  

        1,2,3,

        4,5,6 

    ;

    //获取数组的尺寸和行列数:

    int len = sizeof(arr) / sizeof(arr[0][0]);

    int row = sizeof(arr) / sizeof(arr[0]);

    int column = len / row;

    //知道了长度就可以使用calloc创建一个给定长度的数组(但用完记得要free)

    int* new_arr = (int*)calloc(len, sizeof(int));

    //将二维数组内的数值写入一维数组

    for (int i = 0; i < len; i++)

   

        //确定行号 用索引 i 除以(每行中有几列) 得到行数

        int y = i / column; // 如 第5个数 / 每列有3个,则为 4/3= “1”(第二行)

        //确定列

        int x = i % column; // 如 第5个数 % 每列有3个,则为 4/3= 1余 “1” (第二个)

        //将该数值写入新数组

        if (!new_arr) free(new_arr); return 1; //new_arr为空的验证,如果出现此错误则 return 1

        else

            new_arr[i] = arr[y][x];

       

   

    //输出新数组的数字

    for (int i = 0; i < len; i++)

   

        if (!new_arr) free(new_arr); return 1;

        else

            printf("%d ", new_arr[i]);

       

   

    free(new_arr);

参考技术A 以下是一个 C 语言程序,实现了将二维数组的元素存入一维数组中并输出。假设定义了一个 3 行 4 列的二维数组 arr,则将数组元素按行优先的方式存入一个长度为 12 的一维数组 arr1d,并输出一维数组中的所有元素。

Copy code
#include <stdio.h>

int main()
// 定义二维数组
int arr[3][4] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;

// 将二维数组元素按行优先的方式存入一维数组中
int arr1d[12];
int idx = 0;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++)
arr1d[idx++] = arr[i][j];



// 输出一维数组中的所有元素
for (int i = 0; i < 12; i++)
printf("%d ", arr1d[i]);

printf("\n");

return 0;

在程序中,首先定义了一个 3 行 4 列的二维数组 arr,并初始化了其所有元素。然后,程序定义了一个一维数组 arr1d,用于存储所有的二维数组元素。

程序中使用了两个嵌套的 for 循环遍历二维数组,并将每个元素存入一维数组中。由于我们使用了行优先的方式,因此对于每个元素,我们只需依次将其存入一维数组中即可。

最后,程序使用一个 for 循环输出了一维数组中的所有元素,以验证我们的实现是否正确。

程序的输出结果为:

Copy code
1 2 3 4 5 6 7 8 9 10 11 12
可以看到,我们将二维数组的所有元素按行优先的方式存入了一维数组并成功输出,实现了题目所要求的功能。
参考技术B 可以采用两种方式:
1
按元素赋值:
遍历一维数组,并将每个元素赋值到二维数组的对应元素上。
或者遍历二维数组,将每个元素赋值为一维数组对应值上。
优点为操作灵活,可以按照需要任意赋值。
2
当一维数组和二维数组类型相同,而且赋值顺序与一维数组中的存储顺序完全相同时,可以用memcpy的方式,直接一次性赋值。
如一维数组为a,二维数组为b,基础类型为type,需赋值元素个数为n,可以调用
memcpy(b,a,sizeof(type)*n);
该方法有点为操作简单,执行效率高。
不过所需满足的前提条件多。在满足上述所有条件时,用memcpy的方式更为简单。

阿里高频题动画讲解二叉树深度优先遍历

在 中,我们学习了二叉树的层次遍历,这次我们要学习的是二叉树的深度优先遍历。这是两种非常经典的二叉树遍历方式,可以说,属于面试大厂时闭着眼都要能写出来的方式。

1 例题描述

给当一个二叉树和一个数S,验证是否存在一个从root到leaf的路径,路径上元素的和恰好等于S。

例子1

比如S=10,下图中就存在 1-3-6这条路径。

例子2

再比如S=23,下图中是存在 12-1-10这条路径的。

2 问题分析

因为我们要寻找的是从root到leaf的路径,显然可以使用深度优先搜索(DFS)来完成任务。

利用DFS来递归访问一个二叉树时,我们是从根节点开始,然后在每一步中,分别递归地访问当前节点的左右子节点。

具体到今天这道题,我们可以这么做(后面有动画展示):

  • 从root节点开始进行DFS遍历
  • 如果当前节点不是leaf节点,做两件事:
    • 更新S值,将S值减去当前节点的值,作为新的S值,即S = S - node.value
    • 递归访问该节点的左右子节点,同时传入更新后的S值
  • 在每一步中,如果当前节点是leaf节点,并且节点的值等于传过来的S值,此时,我们就找到一条满足条件的路径!返回true即可。
  • 如果当前节点是leaf节点,但是节点的值不等于传入的S,则说明该从root到该leaf的路径不符合要求,返回false即可。

例子2为例,整个算法过程如下所示:

3 代码实现

class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right


def has_path(root, sum):
if root is None:
return False

# 当前节点是leaf节点,
# 并且它的节点值等于传过来的S值,
# 我们就找到了一个路径
if root.val == sum and root.left is None and root.right is None:
return True

# 递归遍历左右子树
# 当任何一棵子树返回true时
# 就返回true给上级调用
return has_path(root.left, sum - root.val) or has_path(root.right, sum - root.val)

4 思考题

如何找到所有满足条件的路径呢?且听下回分解。



往期精彩回顾





以上是关于(c语言程序执行结果分析题)按行优先的方式把一个二维数组的元素存入一个一维数组中,并输出?的主要内容,如果未能解决你的问题,请参考以下文章

R语言基础题及答案——R语言与统计分析第二章课后习题(汤银才)

R语言基础题及答案——R语言与统计分析第二章课后习题(汤银才)

阿里高频题动画讲解二叉树深度优先遍历

Linux:如何执行一条指令,并把执行结果按行划分存到数组中呢?

php将数组元素按行写入文本文件

超详细C语言版数据结构:图的深度优先遍历(推荐收藏)