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

分析:

  • 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作;
  • 注意有四种打印模式(左右,上下,右左,下上),所以需要一个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. c语言和c++栈的简单实现以及构造器的原理

    也就是训练将原来的c语言 用类表示出来.. 关于构造器: //1与类名相同 没有返回值 被系统生成对象时自动调用,用于初始化 //2 可以有参数 构造器重载 默认参数 //3 重载和默认不能同时存在, ...

  2. 开源ORM

    Farseer.net轻量级开源框架 目录 https://github.com/steden/Farseer.net ---------------------------------- SunSo ...

  3. E20180224-hm-xa

    separator n. 分离器,分离装置; 防胀器; colon n. 冒号; <解>结肠; 科郎(哥斯达黎加货币单位); semicolon  n. 分号;

  4. idea打开可选项目

    配置上面的即可

  5. Linux 常用命令二 pwd cd

    一.pwd命令 显示整个路径名: wang@wang:~$ pwd /home/wang 二.cd命令 切换到其他路径(相对路径方式): wang@wang:~$ cd workpalce/ wang ...

  6. bzoj 3110 [Zjoi2013]K大数查询【树套树||整体二分】

    树套树: 约等于是个暴力了.以区间线段树的方式开一棵权值线段树,在权值线段树的每一个点上以动态开点的方式开一棵区间线段树. 结果非常惨烈(时限20s) #include<iostream> ...

  7. 【爬坑系列】之vxlan网络实现

    linux 内核从3.7之后就内部集成了vxlan功能,所以可以使用linux内核提供的vxlan功能,经过配置创建vxlan网络. 而从Docker自Docker Engine 1.9之后,就自带o ...

  8. iOS 集成React Native到现有iOS应用(Ficow本人实测,Xcode 8.3,iOS 10.3)

    详细操作步骤,请 参考官方文档  或者翻译文档 ! 我补充一些必要的注意事项: 1.引入React.a文件.配置User Header Search Paths 引入React.a文件(点击+可以看到 ...

  9. 机器学习基础算法__python实现(基于numpy等基础库)

    # 博客转自https://blog.csdn.net/weixin_39561100/article/details/80879211 主要是将<机器学习实战>中的算法实现一遍,后续会慢 ...

  10. 01背包(分组) HDOJ 4341 Gold miner

    题目传送门 题意:有n个金矿,每个金矿有抓取的消耗的时间和价值,矿工在原点,问在T时间内能得到的最大的价值 分析:唯一和01背包不同的是金矿可能共线,也就是抓取近的金矿后才能抓后面共线的金矿.这是分组 ...