剑指Offer-顺时针打印数组

题目描述:输入一个数组(m*n维),要求从外向里顺时针打印数组的元素。

#include <iostream>
#include <stdio.h>
using namespace std;

void PrintMatrixInCircle(int **numbers,int rows,int columns,int start);
void printNumber(int number);
void PrintMatrixCircle(int **numbers,int rows,int columns)
{
    //验证输入是否符合要求
    if(numbers==NULL||rows<=0||columns<=0)
        return;
    //每一圈从左上角元素开始,numbers[start][start]
    int start=0;
    //循环条件的理解
    while(rows>2*start&&(columns>2*start))
    {
        PrintMatrixInCircle(numbers,rows,columns,start);
        ++start;
    }
}
void PrintMatrixInCircle(int **numbers,int rows,int columns,int start)
{
    //从左像右打印矩阵
    for(int i=start;i<=columns-1-start;++i)
    {
        int number=numbers[start][i];
        printNumber(number);
    }

    //从上向下打印矩阵
    //前提条件:终止行号>起始行号
    if(start<rows-1-start)
    {
        for(int i=start+1;i<=rows-1-start;++i)
        {
            int number=numbers[i][columns-1-start];
            printNumber(number);
        }
    }

    //从右向左打印矩阵
    //前提条件:终止行号>起始行号,并且,终止列号>起始列号
    if((start<columns-start-1)&&(start<rows-1-start))
    {
        for(int i=columns-2-start;i>=start;--i)
        {
            int number=numbers[rows-1-start][i];
            printNumber(number);
        }
    }

    //从下向上打印矩阵
    //前提条件:至少为三行两列。终止行号-起始行号=2,并且,终止列号>起始列号
    if((start<rows-1-start-1)&&(start<columns-1-start))
    {
      for(int i=rows-1-start-1;i>=start+1;--i)
      {
          int number=numbers[i][start];
          printNumber(number);
      }
    }
}

void printNumber(int number)
{
    printf("%d\t ",number);
}
void Test(int rows,int columns)
{
    printf("Test Begin:%d columns,%d rows.\n",columns,rows);
    //不符合条件的输入
    if(rows<1||columns<1)
        return;

        int i;
    //将二维数组的每一行看做一个指针数组,
    //并指定分为rows行。
    int **numbers=new int*[rows];
    for(i=0;i<rows;++i)
   {
    //为二维数组的每行分配columns个数。
        numbers[i]=new int[columns];
        for(int j=0;j<columns;++j)
        {
            numbers[i][j]=i*columns+j+1;//定义二维数组的值
        }
   }
    PrintMatrixCircle(numbers,rows,columns);
    printf("\n");

    for(int i=0;i<rows;++i)
        delete[] (int*)numbers[i];

    delete[] numbers;
}
int main()
{
    Test(4,4);
    Test(4,5);
    return 0;
}

时间: 2024-11-09 00:02:14

剑指Offer-顺时针打印数组的相关文章

剑指offer 顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:一定要记住循环继续的条件是columns > start * 2,rows > start * 2; 一圈的打印分为四步: 第一步:无条件打印第一行,从左往右: 第二步:终止行号大于起始行号,打印最后一列,从上往下: 第

剑指offer顺时针打印矩阵python

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路 分别给行和列设置两个数字作为边界值,每一次循环之后,缩小边界. 代码 # -*- coding:utf-8 -*- class Solution: # matrix类型为二维列表,需要返回列表 def print

剑指OFFER之把数组排成最小的数(九度OJ1504)

题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数.输入的第二行包括m个正整数,其中每个正整数不超过10000000. 输出: 对应每个测试案例,输出m个数字能排成的最小数字. 样例输入: 3 23 13 6 2 23456 56 样

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

剑指offer (33) 把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接处的所有数字中最小的一个 例如输入数组 {3, 32, 321}则打印这3个数字能排成的最小数字 321323 两个数字m和n能拼接成数字mn和nm,如果mn < nm,则打印出mn,也就是m排在n之前,我们定义此时 m 小于 n,也就是相当于 自定义了qsort排序的 函数指针 本题拼接数字可能超出表达范围,需用大数解决 int compare(const void* strNumber1, const void* str

剑指offer (41) 有序数组数字之和

题目:输入一个递增排序的数组和一个数字target,在数组中查找两个数使得它们的和正好是target 题解分析: 一提到有序数组,应该立马联想到 二分查找 因为数组已经有序了,我们可以设置两个游标first和last,下标first指向 0, last指向 size() - 1, 然后相加 如果 相加和 大于 target,last-- 如果 相加和 小于 target,first++ T(n) = O(n) void TwoSum(const std::vector<int>& nu

剑指Offer:把数组排成最小的数【45】

剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3个数字能拼接成的最小数字是321323. 方法论 简要思路 最暴力的方法是把这个数组中的所有数字的全排列暴力出来,然后找个最小的.但是显然我们不能这么做. 我们应该定义一个排序规则,: 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来.关键就是制定排序

【剑指offer】旋转数组的最小数字

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 分析描述: 求一个数组中的最小值,最简单的办法就是逐个比较数组中各个元素的值,遍历完整个数组,即可得数组中最小元素.但这种方法存在的问题是时间复杂度为O(n). 利用题目中给出的条件:递增排序数组的旋转.利用递增排序的特点,可以用二分查找方法实现时间复杂度为O(logn)的查找.

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输