面试例题:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?

(中国台湾著名硬件公司2007年11月面试题)(自程序员面试宝典第二版p89)

程序实现如下:

分析:例如输入为8的时候得到的zigzag数组为:

从上面的标记的方向应该可以看到,这个数组就是按照对角规律进行的,那么我在写程序的时候,会用一个两层的for来填充这个数组。为了从这个规律入手,我们在考虑这个数据的填充是要理清一个思路,不要按那两层的for循环考虑,只需要考虑第(i,j)位置与(i,j)的关系就OK了,那么对应的填充函数就填充相应的(i,j)的函数。

 
由于对同一斜线上的元素,s=i+j为常数

1.对于第n个(n<N)斜线:

每一斜线个数比上一行多一个,则每一斜线的第一个值表示了在该斜线之前元素的个数,即一个累加 :

(s+1)*s/2

斜线中的任意元素可表示为s*(s+1)/2+i

2.同理对于第n个(n>=N)的斜线:

每斜线的元素个数开始减少,等差数组不适用,为方便起见,可以用减法计算元素个数,

剩余元素的斜线数目:s1=(2(N-1)-(i+j))

元素值=(N*N-(s1+1)*s1/2)-(N-i)=下一斜线的第一个元素值-该斜线剩余元素的个数

 
程序如下:
#include <iostream>
#include <stdio.h>
using namespace std; int main()
{
int N;
int s, i, j;
int squa;
scanf("%d", &N);
int **a = (int **)malloc(N * sizeof(int));
if(NULL == a)
{
return 0;
}
//空间分配
for(i = 0; i < N; i++)
{
if(NULL == (a[i] = (int*)malloc(N * sizeof(int))))
{
while(--i >= 0)
{
free(a[i]);
}
free(a);
return 1;
}
}
squa = N * N;
//求对应位置上应填写的值
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
s = i + j; if(s < N)//上三角
{
s = i + j;//为了看的更清楚,这里加了这条与下面对称的语句
a[i][j] = s * (s + 1) / 2 + ((0 == (i + j) % 2) ? i : j);
}
else//下三角
{
s = (N - 1 - i) + (N - 1 - j);
a[i][j] = squa - s * (s + 1) / 2 - (N - ((0 == (i + j) % 2) ? i : j));
}
}
}
//打印输出
for(i = 0; i < N; i ++)
{
for(j = 0; j < N; j++)
{
printf("%6d", a[i][j]);
}
printf("\n");
} return 0;
}

  

形成一个zigzag数组(JPEG编码里取像素数据的排列顺序)的更多相关文章

  1. zigzag数组实现

    题目出自面试宝典8.3.2 题目描述: 输入n,求一个n*n的矩阵,规定矩阵沿45度线递增,形成一个zigzag数组(JPEG编码里去像素数据的排列顺序),请问如何用C++实现? 例如: n=2 0 ...

  2. LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)

    给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...

  3. JPEG编码(二)

    来自CSDN评论区http://bbs.csdn.net/topics/190980 1. 色彩模型 JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, ...

  4. JPEG编码(一)

    JPEG编码介绍. 转自:http://blog.chinaunix.net/uid-20451980-id-1945156.html JPEG(Joint Photographic Experts ...

  5. java.sql.ResultSet技术(从数据库查询出的结果集里取列值)

    里面有一个方法可以在查询的结果集里取出列值,同理,存储过程执行之后返回的结果集也是可以取到的. 如图: 然后再运用 java.util.Hashtable 技术.把取到的值放入(K,V)的V键值里,K ...

  6. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

  7. CUDA JPEG编码

    基于英伟达的jpegNPP工程,分离实现独立的JPEG压缩. 由于原工程是直接把解码时的jpeg图片的信息直接作为编码时的信息,所以在做独立的JPEG编码时,需要自己来填充各种信息. 1.JPEG编码 ...

  8. php foreach 语法的遍历来源数组如果不是一个有效数组php会出现错误警告 Invalid argument supplied for foreach()

    在php中,foreach语法的遍历来源数组如果不是一个有效数组,php会出现错误警告 Invalid argument supplied for foreach() ,但是很多时候这个数组是取自某些 ...

  9. java中将一个字符数组赋值给另一个,两者同时变化

    java中将一个字符数组赋值给另一个,两者的变化怎么是同步的?怎么才能让他们独立开? 比如有一个int[][] a 已经存在值,现在定义int[][] b=a;之后改变a的值,为何b也跟着改变?怎么才 ...

随机推荐

  1. linux下命令行工具gcp显示拷贝进度条

    1.环境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x ...

  2. ACM-ICPC 2018 焦作赛区网络预赛G Give Candies(隔板定理 + 小费马定理 + 大数取模,组合数求和)题解

    题意:给你n个东西,叫你把n分成任意段,这样的分法有几种(例如3:1 1 1,1 2,2 1,3 :所以3共有4种),n最多有1e5位,答案取模p = 1e9+7 思路:就是往n个东西中间插任意个板子 ...

  3. keepalived主从及双主配置

    高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...

  4. springmvc-自定义消息转换器

    最近的项目没有用到这个,先把自己自学跑通的例子先帖出来,供自己以后参考吧! 如有不对地方望指出! 一.自定义类实现AbstractHttpMessageConverter package com.dz ...

  5. 【附6】hystrix metrics and monitor

    一.基本方式 hystrix为每一个commandKey提供了计数器 二.实现流程 https://raw.githubusercontent.com/wiki/Netflix/Hystrix/ima ...

  6. (转)Nuts and Bolts of Applying Deep Learning

    Kevin Zakka's Blog About Nuts and Bolts of Applying Deep Learning Sep 26, 2016 This weekend was very ...

  7. ASP.NET MVC之Bundle压缩JS和CSS

    介绍Bundle之前先引用<淘宝技术这十年>中一段话,对Web前端稍微有点常识的人都应该知道,浏览器下一步会加载页面中用到的CSS.JS(JavaScript).图片等样式.脚本和资源文件 ...

  8. quality center 支持的平台

  9. python中sys.stdout、sys.stdin

    如果需要更好的控制输出,而print不能满足需求,sys.stdout,sys.stdin,sys.stderr就是你需要的. 1. sys.stdout与print: 在python中调用print ...

  10. 《剑指offer》第二十八题(对称的二叉树)

    // 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...