出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字;

分析:

  • 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作;
  • 注意有四种打印模式(左右,上下,右左,下上),所以需要一个index变量控制每次循环时执行的打印模式;
  • 注意水平打印和垂直打印分别需要两个变量控制打印元素,并且两组变量中的两个端点都是相互靠近的(hs和he,vs和he),每执行一种打印模式之前,需要更新当前打印模式中打印方向的其实坐标,因为它已经在上一种打印模式中打印过;
  • 每一种打印模式执行之前需要检测hs>he或者vs>ve,如果成立则打印结束;
  • 其他方法:递归法:每次都打印矩阵第一行,然后将剩余的元素逆时针旋转90度创建一个矩阵;贪吃蛇法:创建一个bool矩阵表示元素是否被打印,然后创建一个类似index的控制打印模式的变量,遇到false的元素就转到下一个打印模式;

解题:

 /**
* 设置四个变量,两两一组分别表示水平和垂直方向的打印的起始点
* index表示四种打印方式中的一种(左右,上下,右左,下上)
* 当两两一组的变量中hs>he或者vs>ve的时候结束打印
* 注意每一种打印模式开始之前,需要更新起始点的坐标,因为
* 它已经在上一个打印模式中打印过
* */
void clockwisePrintMatrix(int *array, int x, int y) {
int hs=-, he=x-;
int vs=, ve=y-;
int index=; while(true) {
printf("hs=%d, he=%d, vs=%d, ve=%d\n",hs,he,vs,ve);
index%=;
if(index==) {
/**
* 左右打印模式:
*
* */
hs++;
if(hs>he) break;
for(int i=hs;i<=he;i++)
printf("%d, ",array[vs*x + i]);
printf("\n");
} else if(index==) {
/**
* 上下打印模式:
*
* */
vs++;
if(vs>ve) break;
for(int i=vs;i<=ve;i++)
printf("%d, ",array[i*y + he]);
printf("\n");
} else if(index==) {
/**
* 右左打印模式:
*
* */
he--;
if(hs>he) break;
for(int i=he;i>=hs;i--)
printf("%d, ",array[ve*x + i]);
printf("\n");
} else if(index==) {
/**
* 下上打印模式:
*
* */
ve--;
if(vs>ve) break;
for(int i=ve;i>=vs;i--)
printf("%d, ",array[i*y + hs]);
printf("\n");
}
index++;
}
} int main() {
int matrix[]={,,,,,,,,,,,,,,,,,,,,,,,,};
clockwisePrintMatrix(matrix, , );
return ;
}

出题:一个数组中,某一个数字减去它右边数字得到一个数对差,求所有数对差中的最大值;

分析:

  • 数对差的解法可转换成求最大子数组和,或者转换成DP问题;
  • 解法1:构建子数组最大和值
    定义数
    组:array[i]-array[i+1];array[i+1]-array[i+2];……;array[j-1]-array[j];所以
    array[i]-array[j]的差就是前面所有相邻元素差的和,所以将原始数组转换成相邻元素的差组成的数组,而求原数组元素差的最大值转换成新数
    组的子数组元素的最大和;
  • 解法2:动态规划解法:diff[i]存储array[i]与其左边数组最大元素的差值,得到diff[i]之后求diff[i+1],则需要知道 array[i+1]左边数组的最大元素,而有两种可能,计算diff[i]的时候得到的最大值,或者就是array[i]。所以只需一遍扫描就可以;

解题:

 int MaxDif(int *array, int length) {
/**
* 定义局部stack数组存储相邻元素差值
* 循环获取相邻元素差值
* */
int difarray[length-];
for(int i=;i<length-;i++) {
difarray[i]=array[i]-array[i+];
printf("\n%d",difarray[i]);
}
/**
* sum记录最大和值
* tempsum记录当前元素的和值
* 如果元素为+++++++,则从开始相加到最后
* 如果元素为-------,则sum保持为0
* 如果元素为++++---,则sum保持为前半正数
* 如果元素为----+++,则sum保持为后半正数
* 还有其他满足条件的情况
* */
int tempsum=, sum=;
for(int i=;i<length-;i++) {
tempsum+=difarray[i];
if(tempsum<)
tempsum=;
else if(tempsum>sum)
sum=tempsum;
} return sum;
} int MaxDifDP(int *array, int length) {
/**
* difarray[i]用于存储array[i]左边的最大元素
* 与array[i]的差值,
* difarray[i+1]同理,但根据DP原理,左边的最大
* 元素可能是array[i]找到的最大元素,可能是
* array[i]本身,所以一遍扫描,DP复用
* */
int difarray[length-];
int max=array[];
for(int i=;i<length-;i++) {
if(array[i]>max)
max=array[i];
difarray[i]=max-array[i+];
}
int difmax=difarray[];
for(int i=;i<length-;i++) {
if(difarray[i]>difmax)
difmax=difarray[i];
}
return difmax;
} int main() {
int array[]={,,,,-,,,};
printf("\nthe max diff is: %d",MaxDif(array,));
printf("\nthe max diff is: %d",MaxDifDP(array,));
return ;
}

笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值的更多相关文章

  1. php笔试算法题:顺时针打印矩阵坐标-蛇形算法

    这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...

  2. 《剑指offer》第二十九题(顺时针打印矩阵)

    // 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...

  3. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...

  4. 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)

    议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...

  5. 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题

    剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...

  6. [PHP] 算法-顺时针打印矩阵的PHP实现

    1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1 2.外层循环控制圈数,内层四个for循环,i 3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; ...

  7. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  8. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  9. 剑指offer---1、顺时针打印矩阵

    剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...

随机推荐

  1. ExtJS 4 MVC 创建 Viewport

    http://ext4all.com/post/extjs-4-mvc-with-viewport 效果图: 结构图: 没有用到Model层,直接在view里面写上 默认的 json的数据 中间Pan ...

  2. [知识积累]python3使用xlwt时写入文档字体颜色和边框样式

    可借鉴的网址:https://www.programcreek.com/python/example/39979/xlwt.Alignment 可以直接通过pip安装xlwt 个人理解: xlwt中对 ...

  3. HDU3949:XOR(高斯消元)(线性基)

    传送门 题意 给出n个数,任意个数任意数异或构成一个集合,询问第k大个数 分析 这题需要用到线性基,下面是一些资料 1.高斯消元&线性基&Matirx_Tree定理 笔记 2.关于线性 ...

  4. Chrome应用商店打不开解决方法

    方法一.谷歌访问助手(推荐) 谷歌访问助手是一款免费的谷歌代理插件,不用配置即可打开Chrome应用商店,而且速度很不错. 1.根据自己使用的浏览器点击对应版本的插件.详细安装都在下面链接中. 下载地 ...

  5. 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...

  6. 数据结构 - 链栈的实行(C语言)

    数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...

  7. hihoOffer收割练习20题目2

    题目2 : SCI表示法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 每一个正整数 N 都能表示成若干个连续正整数的和,例如10可以表示成1+2+3+4,15可以表示 ...

  8. 题解报告:hdu 1503 Advanced Fruits(LCS加强版)

    Problem Description The company "21st Century Fruits" has specialized in creating new sort ...

  9. 对dynamic和lambda的学习

    var, object, dynamic的区别以及使用 dynamic(2) – ExpandoObject的使用 .NET中的Lambda表达式与匿名方法

  10. 转 Oracle Transportable TableSpace(TTS) 传输表空间 说明

    ############1   迁移数据库的集中方法 三.相关技术 迁移方式 优势 不足1 Export and import • 对数据库版本,以及系统平台没有要求 • 不支持并发,速度慢• 停机时 ...