5.算法
一、细碎算法
1、数组:一个二维数组,每一行按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序, 判断一个整数是否包含着在这个数组中?
可以采用删减法来减少查找的范围,从左下角或者右上角的地方开始,寻找某个数,若从右上角开始寻找,则当数组中的这个数大于寻找的数时,应该列向值小的一方移动,当小于时,应该向行大于的方向移动:如下,见offer面试3
def find(matrix,target): if matrix==None or len(matrix)==0: return 0 rows=len(matrix) cols=len(matrix[0]) row,col=0,cols-1 count=0 while row<=rows-1 and col>=0: if matrix[row][col]>target: col-=1 elif matrix[row][col]<target: row+=1 else: count+=1 col-=1 return count
2 字符串 为了节约内存,c/c++把常量字符串放到单独的一个内存区域,当几个指针赋值给相同的常量字符时,它们实际上会指向相同的内存地址。但是用常量内存初始化数组,正好相反,是不同的内存区域。
算法:将一个带空格的字符串中的空格变成“%20”字符,并为O(n)
首先,先遍历一个字符串,然后统计出空格的个数,然后,再设置两个指针p1,p2,分别指向原来和变换后的字符串结尾,从后往前移动,p1遇到非空格字符移动到p2指向的位置,然后遇到空格,则,p2指向的3个连续内存存为“%20”,则时间复杂度为O(n)
#include <iostream> #include <string.h> #define N 100 void getline(char a[]){ char c; int i=0; while((c=getchar())!='\n'&&c!=EOF){ a[i]=c; i++; } } using namespace std; int main(int argc, char** argv) { char a[N]; getline(a); int p1,count=0; for(int i=0;i<strlen(a);i++){ if(a[i]==' ') count++; } p1=strlen(a)-1+2*count; for(int i=strlen(a)-1;i>=0;i--){ if(a[i]==' '){ a[p1]='0'; a[p1-1]='2'; a[p1-2]='%'; p1-=3; }else{ a[p1]=a[i]; p1--; } } cout<<a; return 0; }
Python:
a=input() count=0 a1=list(a) for i in range(len(a1)): if(a1[i]==' '): a1.pop(i) a1.insert(i,"%20") print("".join(a1))