strcpy的模拟

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
    assert(dest != NULL);
    assert(src != NULL);
    char* ret = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[] = "hello hhhh";
    char arr2[] = "nan";
    my_strcpy(arr1, arr2);
    printf("%s\n", arr1);
}

其中需要注意的是,使用到的assert,断定,还有const,还有while的循环是经过简化的,这是一个优秀代码的代表。

杨氏三角之中的数字寻找,需要时间复杂度小于0(N)

#include <stdio.h>
#include <string.h>
#include <assert.h>
int is_left_move(char* s1, char* s2)
{
    assert(s1 != NULL);
    assert(s2 != NULL);
    int len1 = strlen(s1);
    int len2 = strlrn(s2);
    if (len1 != len2)
        return 0;
    //将s1改为abcdefabcdef
    strncat(s1, s1, len1);
    //再在abcdefabcdef里面寻找是否有旋后字符串
    char* ret=strstr(s1, s2);//该函数返回的是一个字符的地址
    if (ret==NULL)
        return 0;
    else
        return 1;
}
int main()
{
    char s1[30] = "abcdef";
    char s2[] = "cdefab";
    int ret = is_left_move(s1, s2);
    if (ret == 1)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}
时间复杂度小于0(N)的意思是,不能通过穷举法,逐个的进行寻找,所以进行一种比较经典的寻找方法,由于杨氏矩阵的规律为,每行每列都是递增的,所以只需要把需要找的数字在右上角进行比较,若是大于右上角的数字,就能排除当前一行,向下缩进一行,若是小于右上角的数字,就能排除当前一列,向左缩进一列。知道找出想要找到的数字。

左旋字符串

#include <stdio.h>
#include <string.h>
#include <assert.h>
void left_move(char* arr, int k)
{
    assert(arr != NULL);
    int i = 0;
    int j = 0;
    int len = strlen(arr);
    assert(k <= len);
    for (i = 0; i < k; i++)
    {
        char tmp = *arr;
        for (j = 0; j < len - 1; j++)
        {
            arr[j] = arr[j + 1];
            //*(arr+j)=*(arr+j+1);
            //这两句话的意思是一样的
        }
        arr[len - 1] = tmp;
    }
}
//三步翻转法
//ab cdef
//ba fedc
//cdefab
//实现逆序
void resever(char* left,char* right)
{
    assert(left != NULL);
    assert(right != NULL);
    while (left < right)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
void left_move2(char* arr, int k)
{
    assert(arr != NULL);

    int len = strlen(arr);
    assert(k <= len);

    resever(arr,arr+k-1);//逆序左边
    resever(arr+k,arr+len-1);//逆序右边
    resever(arr,arr+len-1);//逆序全部
}
int main()
{
    char arr[] = "abcdef";
    //left_move(arr, 2);
    left_move2(arr, 3);

    printf("%s\n", arr);
    return 0;
}

讲一个字符串进行旋转,左旋,就是把头部逐个接在尾部,最终能够回到当初的样子,这样为一个周期,直接进行比较的思路是,一个一个进行字符的旋转,每一次旋转,进行一次字符串比较,比较暴力,所以用一种比较巧妙的方法,现将字符串进行一个扩充,比如abcd,扩充成为abcdabcd那么旋转之后的字符串就在这个字符串里,这时候再使用strstr函数寻找是否有对应的子字符串,还有一点需要注意的是,abc也在abcdabcd中,但并不是abcd旋转之后的字符串,所以再将字符串长度做一个对应的判断就好。