经典算法面试题目-置矩阵行列元素为0(1.7)

题目

Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.

写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0.

解答

简单题。遍历一次矩阵,当遇到元素等于0时,记录下这个元素对应的行和列。
可以开一个行数组row和列数组col,当元素a[i][j]等于0时, 就把row[i]和col[j]置为1。
第二次遍历矩阵时,当某个元素对应的行row[i] 或列col[j]被设置为1,说明该元素在需要被置0的行或列上,因此将它(行/列)置0。

代码如下:

#include <iostream>
#include <cstring>
using namespace std;

void zero(int a[5][5], int m, int n){
    bool row[m], col[n];
    memset(row, 0, sizeof(row));
    memset(col, 0, sizeof(col));
    for(int i=0; i<m; ++i)
        for(int j=0; j<n; ++j)
            if(a[i][j] == 0){
                row[i] = true;
                col[j] = true;
            }
    for(int i=0; i<m; ++i)
        for(int j=0; j<n; ++j)
            if(row[i] || col[j])
                a[i][j] = 0;
}

int main()
{
    int a[5][5] = {
        {1, 2, 3, 4,5},
        {5, 6, 0, 7,8},
        {9, 0, 1, 1,2},
        {3, 4, 1, 1,9},
        {4, 3, 0, 6,9}
    };
     for(int i=0; i<5; ++i){
        for(int j=0; j<5; ++j)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;

    zero(a, 5, 5);
     for(int i=0; i<5; ++i){
        for(int j=0; j<5; ++j)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
    return 0;
}

输出结果:

时间: 2024-09-24 01:09:30

经典算法面试题目-置矩阵行列元素为0(1.7)的相关文章

经典算法面试题目-矩阵旋转90度(1.6)

题目 Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place? 一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度. 你能原地进行操作吗?(即不开辟额外的存储空间) 解答 我们假设要将图像逆时针旋转90

经典算法面试题目-设计算法移除字符串中重复的字符(1.3)

题目 Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not. FOLLOW UP Write the test cases for this metho

经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)

题目: Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures? 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构. (即只使用基本的数据结构) 解答: 首先,你可以问面试官,构成字符串的字符集有多大?是ASCII字符,还是只是26个字母? 还是有更大的字符集,对于不同

经典算法面试题目-判断两个字符串是否是变位词(1.4)

题目 Write a method to decide if two strings are anagrams or not. 写一个函数判断两个字符串是否是变位词. 解答 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词. 比如说, abbcd和abcdb就是一对变位词. 也就是说,2个字符串,不管排列顺序如何,只要全部的单个字符能对应上,就是一对变位词! 该题目有两种做法: 时间复杂度为O(nlogn)的解法 由于组成变位词的字符是一模一样的,所以按照字典序排序后,两

经典算法面试题目-判断s2是否是s1的旋转字符串(1.8)

题目 Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., "waterbottle" is a rotation of &qu

经典算法面试题目-翻转一个C风格的字符串(1.2)

题目: Write code to reverse a C-Style String. (C-String means that "abcd" is represented as five characters, including the null character.) 写代码翻转一个C风格的字符串.(C风格的意思是"abcd"需要用5个字符来表示,包含末尾的 结束字符) 解答: 这道题如果就是要考察你有没有注意到C风格字符串最后的那个结束符,那我觉得还是像书

C语言 经典题目螺旋矩阵 实例详解_C 语言

C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include <stdio.h> #include <stdlib.h> int main() { int N,i,j,n,num=1; int a[10][10]={0}; printf("输入你要输出的几阶中断:"); scanf("%d",&N); for(n=0;n<=N/2;n++) { for(j=n;j<=N-n-1;j++) a[n][j]=num++; fo

经典算法(15) “一步千里”之数组找数

首先看看题目要求(题目来源:http://weibo.com/lirenchen,特此鸣谢): 有这样一个数组A, 大小为n,相邻元素差的绝对值都是1.如:A={4,5,6,5,6,7,8,9,10,9}.现在,给定A和目标整数t,请找到t 在A中的位置.除了依次遍历,还有更好的方法么? 这道题目的解法非常有趣. 数组第一个数 为array[0], 要找的数为y,设t = abs(y - array[0]).由于每个相邻的数字之差的绝对值为1.故第t个位 置之前的数肯定都比y小.因此直接定位到a

经典算法(12) 数组中只出现1次的两个数字(百度面试题)

首先来看题目要求: 在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找 出这两个数字. 考虑下这个题目的简化版--数组中除一个数字只出现1次外,其它数字都成对出现 ,要求尽快找出这个数字.这个题目在之前的<位操作基础篇之位操作全面总结>中的"位操作趣味应用" 中就已经给出解答了.根据异或运算的特点,直接异或一次就可以找出这个数字. 现在数组中有两个 数字只出现1次,直接异或一次只能得到这两个数字的异或结果,但光从这个结果肯定无法得到这个两个数字 .因此我