鱼C论坛

 找回密码
 立即注册
查看: 1258|回复: 4

[已解决]剑指offer关于循环的题目

[复制链接]
发表于 2020-2-24 11:22:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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[0].size();
        vector<int> result;
        
        while (true)
        {
            //从左到右打印
            for(int i=col1;i<col2;i++)
            {
                result.push_back(matrix[row1][i]);
            }
            row1++;
            if(row1>=row2) break;
            //从上往下
            for(int i=row1;i<row2;i++)
            {
                result.push_back(matrix[i][col2-1]);
            }
            col2--;
            if(col1>=col2) break;
            //从右往左
            for(int i=col2-1;i>=col1;i--)
            {
                result.push_back(matrix[row2-1][i]);
            }
            row2--;
            if(row1>=row2) break;
            //从下往上
            for(int i=row2-1;i>=row1;i--)
            {
                result.push_back(matrix[i][col1]);
            }
            col1++;
            if(col1>=col2) break;
        }
        
        return result;
    }
};

麻烦各位大佬问一下,怎么突然间发现  if(row1>=row2) break;  while (true)是什么意思啊这不就只是打印了最外圈吗
最佳答案
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[0].size();
        vector<int> result;
        
        while (true)
        {
            //从左到右打印一行
            for(int i=col1;i<col2;i++)
            {
                result.push_back(matrix[row1][i]);
            }
            row1++; // 指向最上面未打印的行
            if(row1>=row2) break; // 如果所有行打印完了,终止while
            //从上往下打印最右侧未打印的一列
            for(int i=row1;i<row2;i++)
            {
                result.push_back(matrix[i][col2-1]);
            }
            col2--; //指向刚从上往下打印列号
            if(col1>=col2) break; // 如果所有列打印完了, 终止while循环
            //从右往左打印最下面未打印的一行
            for(int i=col2-1;i>=col1;i--)
            {
                result.push_back(matrix[row2-1][i]);
            }
            row2--; //指向刚刚从左往右打印的一行
            if(row1>=row2) break;  // 如果所有行打印完了, 终止while循环
            //从下往上打印最左侧未打印的一列
            for(int i=row2-1;i>=row1;i--)
            {
                result.push_back(matrix[i][col1]);
            }
            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.
所有行打印完和所有列打印完这两个条件满足一个就表示数组输出结束了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-24 15:51:03 | 显示全部楼层
听不懂  所以你只是想问   if(row1>=row2) break;  while (true)  这两个是什么意思吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0].size();
        vector<int> result;
        
        while (true)
        {
            //从左到右打印一行
            for(int i=col1;i<col2;i++)
            {
                result.push_back(matrix[row1][i]);
            }
            row1++; // 指向最上面未打印的行
            if(row1>=row2) break; // 如果所有行打印完了,终止while
            //从上往下打印最右侧未打印的一列
            for(int i=row1;i<row2;i++)
            {
                result.push_back(matrix[i][col2-1]);
            }
            col2--; //指向刚从上往下打印列号
            if(col1>=col2) break; // 如果所有列打印完了, 终止while循环
            //从右往左打印最下面未打印的一行
            for(int i=col2-1;i>=col1;i--)
            {
                result.push_back(matrix[row2-1][i]);
            }
            row2--; //指向刚刚从左往右打印的一行
            if(row1>=row2) break;  // 如果所有行打印完了, 终止while循环
            //从下往上打印最左侧未打印的一列
            for(int i=row2-1;i>=row1;i--)
            {
                result.push_back(matrix[i][col1]);
            }
            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.
所有行打印完和所有列打印完这两个条件满足一个就表示数组输出结束了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-25 22:21:26 | 显示全部楼层
大哥,这个代码如果想改成在C++编译器上运行的代码该怎么改呀?在网上找了半天只知道节省了I/O(输入和输出)的时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


大哥,这个代码如果想改成在C++编译器上运行的代码该怎么改呀?在网上找了半天只知道节省了I/O(输入和输出)的时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 01:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表