松鼠呀 发表于 2020-2-24 11:22:25

剑指offer关于循环的题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {

      int row1 = 0, row2 = matrix.size();
      int col1 = 0, col2 = matrix.size();
      vector<int> result;
      
      while (true)
      {
            //从左到右打印
            for(int i=col1;i<col2;i++)
            {
                result.push_back(matrix);
            }
            row1++;
            if(row1>=row2) break;
            //从上往下
            for(int i=row1;i<row2;i++)
            {
                result.push_back(matrix);
            }
            col2--;
            if(col1>=col2) break;
            //从右往左
            for(int i=col2-1;i>=col1;i--)
            {
                result.push_back(matrix);
            }
            row2--;
            if(row1>=row2) break;
            //从下往上
            for(int i=row2-1;i>=row1;i--)
            {
                result.push_back(matrix);
            }
            col1++;
            if(col1>=col2) break;
      }
      
      return result;
    }
};

麻烦各位大佬问一下,怎么突然间发现if(row1>=row2) break;while (true)是什么意思啊这不就只是打印了最外圈吗

te___amo 发表于 2020-2-24 15:51:03

听不懂所以你只是想问   if(row1>=row2) break;while (true)这两个是什么意思吗

major_lyu 发表于 2020-2-24 23:45:23

本帖最后由 major_lyu 于 2020-2-24 23:52 编辑

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {

      int row1 = 0, row2 = matrix.size();
      int col1 = 0, col2 = matrix.size();
      vector<int> result;
      
      while (true)
      {
            //从左到右打印一行
            for(int i=col1;i<col2;i++)
            {
                result.push_back(matrix);
            }
            row1++; // 指向最上面未打印的行
            if(row1>=row2) break; // 如果所有行打印完了,终止while
            //从上往下打印最右侧未打印的一列
            for(int i=row1;i<row2;i++)
            {
                result.push_back(matrix);
            }
            col2--; //指向刚从上往下打印列号
            if(col1>=col2) break; // 如果所有列打印完了, 终止while循环
            //从右往左打印最下面未打印的一行
            for(int i=col2-1;i>=col1;i--)
            {
                result.push_back(matrix);
            }
            row2--; //指向刚刚从左往右打印的一行
            if(row1>=row2) break;// 如果所有行打印完了, 终止while循环
            //从下往上打印最左侧未打印的一列
            for(int i=row2-1;i>=row1;i--)
            {
                result.push_back(matrix);
            }
            col1++; // 指向最左侧未打印的列
            if(col1>=col2) break;// 如果所有列打印完了, 终止while循环
      }
      
      return result;
    }
};
while(true)是死循环的意思,循环一直进行,除非遇到break语句才会跳出循环。
根据代码分析可以知道,row1表示剩余未打印的元素最小行号,每完成一次从左往右打印,row1自增1指向下一行,也就是下次需要从左往右的行号,因此行号小于row1的行已经被打印过了。row2表示,上一次从右往左打印的行号, 每完成一次从右往左打印,row2自减1,因此行号大于等于row2的行已经被打印过了。
当row1大于等于row2时表示所有的行打印完了。
if(row1>=row2) break; 所有行打印完跳出while循环。
同样的道理,如果col1 >= col2,则表示所有列打印完了,也要跳出while.
所有行打印完和所有列打印完这两个条件满足一个就表示数组输出结束了。

松鼠呀 发表于 2020-2-25 22:21:26

大哥,这个代码如果想改成在C++编译器上运行的代码该怎么改呀?在网上找了半天只知道节省了I/O(输入和输出)的时间

松鼠呀 发表于 2020-2-25 22:21:58

major_lyu 发表于 2020-2-24 23:45
while(true)是死循环的意思,循环一直进行,除非遇到break语句才会跳出循环。
根据代码分析可以知道,ro ...


大哥,这个代码如果想改成在C++编译器上运行的代码该怎么改呀?在网上找了半天只知道节省了I/O(输入和输出)的时间
页: [1]
查看完整版本: 剑指offer关于循环的题目