程序员面试宝典 zigzag数组问题 p92 new二维数组
2015-06-08 15:41
288 查看
由于对同一斜线上的元素,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)=下一斜线的第一个元素值-该斜线剩余元素的个数
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> using namespace std; int main() { int N=4; int **a=new int* ; for(int i=0;i<N;i++) { a[i]=new int ; } for(int i=0;i<N;i++) for(int j=0;j<N;j++) { int s=i+j; if(s<N) //每一斜线个数比上一行多一个,则每一斜线的第一个值表示了在该斜线之前元素的个数,即一个累加 :s*(s+1)/2 a[i][j]=s*(s+1)/2 + (((i+j)%2!=0) ? i : j); else { s=(N-1-i)+(N-1-j); //每斜线的元素个数开始减少,等差数组不适用,可以用减法计算,剩余元素的斜线数目:s=(N-1-i)+(N-1-j); a[i][j]=N*N-s*(s+1)/2 - (N- ((i+j)%2!=0?i:j)) ; //下一斜线的第一个元素值-该斜线剩余元素的个数 } } for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { cout<<a[i][j]<<" "; } cout<<endl; } for(int i=0;i<N;i++) { delete []a[i]; } delete []a; }
相关文章推荐
- 史上最全的iOS面试题及答案
- JAVA多线程和并发基础面试问答
- 黑马程序员---IOS基础---指针的概念及用法
- 阿里巴巴面试题目
- 微软面试题目
- 黑马程序员 - 技术 blog12 之 类库 by 八戒
- 黑马程序员+对Java中面向对象的总结
- 态度_面试从你进门就开始
- 【剑指offer】 面试题4: 替换空格
- 【免费公开课】如何肉身翻墙到硅谷?硅谷顶尖IT工程师在线传授面试技巧!
- Java面试之斐波纳契数列递归与非递归实现
- 码农们不得不重视的问题
- 国外程序员爱用苹果Mac电脑的10大理由
- 【剑指offer】 面试题3: 二维数组中的查找
- 黑马程序员---单例设计模式
- android面试题 不仅仅是面试是一个很好的学习
- (分享)码农们不得不重视的问题
- 黑马程序员java学习笔记——Collections、Arrays工具类和其他对象
- 成为一个程序员真有那么难吗?
- 黑马程序员---IOS基础---字符串数组及字符串函数