摘要:(这个题目让我想到泡泡堂这个游戏,呵呵!)解题思路:一开始想的是边遍历,边设置行和列为0并标记.这个方法的错误之处在于:这个过程会导致你无法找到所在行列的其它为0的元素。所以,只能先遍历矩阵,找出所有的0元素所在的行和列,并记录下来。之后,可以通过两种方式更新矩阵A,1、通过遍历所有存在0元素的行、列,并置矩阵A中该行、列为0;时间复杂度为M×i+N×j(i,j为存在0的行和列个数)2、再次遍历矩阵A,并判断A[i][j]的下标i或j是否在之前记录下来的存在0的行或列中,时间复杂度为M×N;这是第一种更新矩阵解法#include<iostream>#i
阅读全文
摘要:思路:将一个正方形矩阵看做一层层的,每一层进行旋转。其实这题的解法和“数组循环右移K位”的杂技解法有些类似,只是这题复杂在每一层的下标的确定,而右移字符串则是复杂在循环链的计算和确定。void rotate(){ int i,j,k; int count=0; for (i=0;i<(int)(N/2);i++){ for (j=i;j<N-i-1;j++){ int temp = x[i][j]; x[i][j] = x[N-1-j][i]; ...
阅读全文
摘要:注意此题不是指删除连续的重复字符,而是所有重复的字符。两种思路:1、不用额外的空间。直接在当前字符串上更改,采用类似直接插入排序的方法,将字符串前一部分设为新的字符串,依次判断后续的每一个字符是否在新的字符串中,没有出现则将其添加到新的字符串末尾,否则说明重复,判断下一个字符。最后,将新的字符串末尾置为结束符'\0';(如果是c++的std::string,应该用resize,因为string不通过结束符判断字符串,而是通过内置一个长度判断。)2、使用额外的空间,则可以考虑使用一个set记录已经出现过的字符,或者这里可以使用数组bool hit[256],这是因为字符最多就25
阅读全文