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))

 

posted @ 2019-03-22 21:55  凉生暖至  阅读(122)  评论(0编辑  收藏  举报