【问题标题】:Length of a growing substring in matrix矩阵中不断增长的子串的长度
【发布时间】:2022-01-14 16:25:22
【问题描述】:

例如,给定一个方阵,找出正在增长的子字符串的长度。

matrix     |      result       because of
5          |
1 2 3 4 5  |
2 5 2 5 9  |    
7 8 9 0 1 -->       5     -->   1 2 3 4 5
0 0 0 0 0  |
2 3 6 1 2  |

我尝试将a[i][j]a[i][j+1] 进行比较并增加计数器,但我认为我的问题是当程序在最终元素上并且它不增加计数器时。 这里有我的代码:

int main(){
    int n;
    scanf("%d",&n);
    int i,j,a[n][n];
    for(i = 0;i < n;i++){
        for(j = 0;j <n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    int max=-9999;
    int counter;
    for(i = 0;i < n;i++){
        counter=0;
        for(j = 0;j <n;j++){
            if(a[i][j]<a[i][j+1]){
                counter++;
            }
            if(counter>max){
                max = counter;
            }
        }
    }
    printf("%d",max);
    return 0;
}

【问题讨论】:

  • j 达到最大值时(n - 1),表达式a[i][j+1] 调用Undefined Behaviour,因为元素a[i][n] 不存在(a[i]从索引0n - 1)。
  • 它是方阵有什么意义?它可以“展平”为一个简单的一维数组。
  • @EugeneSh。这是作业问题,它特别告诉我们应该使用矩阵
  • 最长增长的子串可以跨越多行吗?它总是在水平方向吗?这个问题似乎没有明确说明。
  • @ggolen 只是水平的并排成一行

标签: c algorithm for-loop matrix max


【解决方案1】:

对于初学者来说,索引范围不能为负数,因此将变量 max 声明为负值是没有意义的

int max=-9999;

至少可以像这样初始化

int max = 0;

在这个if语句中

if(a[i][j]<a[i][j+1]){

由于表达式a[i][j+1],当ij 等于n - 1 时,可以访问分配的数组之外的内存。

还有这个 if 语句

        if(counter>max){
            max = counter;
        }

应该移到内部 if 语句之外。

并且变量count应该在外循环中声明

您可以通过以下方式重写内部 for 循环

    int counter=1;
    for(j = 1;j <n;j++){
        if(a[i][j-1]<a[i][j]){
            counter++;
        }
    }
    if(counter>max){
        max = counter;
    }

【讨论】:

  • 你能解释一下为什么 counter 和 j 从 1 开始吗?
  • @itmemilan 包含一个元素的序列是具有一个元素的增长序列。:)
猜你喜欢
  • 2021-04-28
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2010-12-05
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多