指针与字符串相关练习题

简介: 我们要考虑时间复杂度问题小于o(N)说明循环次数不能为双for

@TOC

一.杨氏矩阵

在这里插入图片描述

我们要考虑时间复杂度问题

小于o(N)说明循环次数不能为双for

#include<stdio.h>
int search(int arr[3][3], int *px, int *py, int k)
{
    int x = 0;
    int y = *py - 1;//最后一列的坐标
    while (x <= *px - 1 && y >= 0)
    {
        if (arr[x][y] <k)//如果第N行最后一个列的元素值比K还小 说明K值必在下面
        {
            x++;
        }
        else if(arr[x][y]>k)//如果第N+1行最后一列的元素比K值大 说明K值有可能在它左边
        {
            y--;
        }
        else
        {
            *px = x;//将坐标传递回去
            *py = y;
            return 1;
        }
    }
    return 0;
}
int main()
{
    int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    int k = 8;
    int x = 3;
    int y = 3;
    int ret=search(arr, &x, &y,k);//将行x 列y分别进行传址调用 在函数中对应坐标位置可以传回来
    if (ret == 1)
    {
        printf("找到了\n%d %d",x,y);
    }
    else
    {
        printf("没找到\n");
    }
    return 0;
}

二.字符串左旋

在这里插入图片描述

1.

#include<stdio.h>
#include<string.h>
void rotate(char* str, int k)
{
    int i = 0;
    int j = 0;
    char tmp = 0;
    int len = strlen(str);
    for (i = 0; i < k; i++)//根据要左旋次数确定循环次数
    {
        tmp = *str;//将第一个字符赋给tmp
        for (j = 0; j < len - 1; j++)//将后面的字符依次向前赋值
        {
            *(str+j)= *(str + j+1);
        }
        str[len - 1] = tmp;//最后一位字符被tmp赋值
    }
}
int main()
{
    char arr[] = "ABCD";
    int k = 1;
    rotate(arr,k);
    printf("%s\n", arr);
    return 0;
}

2.三步翻转法

#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)//两者交换
{
    while (left < right)
    {
        char tmp = 0;
        tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()
{
    char arr[] = "ABCD";
    int k = 2;
    int len = strlen(arr);
    reverse(arr, arr + k - 1);//将要翻转的字符逆序
    reverse(arr + k, arr + len - 1);//剩余的字符逆序
    reverse(arr, arr + len - 1);//整体逆序
    printf("%s\n", arr);
    return 0;
}

三.字符串旋转结果

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int  rotate(char* str, char*str2)
{
    int i = 0;
    int j = 0;
    char tmp = 0;
    int len = strlen(str);
    for (i = 0; i < len; i++)//根据要左旋次数确定循环次数
    {
        tmp = *str;//将第一个字符赋给tmp
        for (j = 0; j < len - 1; j++)//将后面的字符依次向前赋值
        {
            *(str + j) = *(str + j + 1);
        }
        str[len - 1] = tmp;//最后一位字符被tmp赋值
        if (strcmp(str, str2) == 0)//如果两个字符串相等
        {
            return 1;
        }
    }
    return 0;
}
int main()
{
    char arr1[] = "AABCD";
    char arr2[] = "BCDAA";
    int ret=rotate(arr1, arr2);//左旋即可判断所有情况
    if (ret == 1)
    {
        printf("是\n");
    }
    else
    {
        printf("否\n");
    }
    return 0;
}

四.颠倒字符串

#include<stdio.h>// i love you.-----.uoy evol i----- you love i
#include<string.h>
void swap(char* left, char* right)//两者交换
{
    while (left < right)
    {
        char tmp = 0;
        tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main()        
{
    char arr[] = "i love you.";
    int len = strlen(arr);
    swap(arr, arr + len - 1);
    char* dest = arr;
    char* src = arr;
    while (*src!='\0')
    {
        while (*src != ' '&&*src!='\0')
        {
            src++;
        }
        char* prev = src - 1;
        swap(dest, prev);
        if (*src != '\0')
        {
            src++;
        }
        dest = src;
    }
    printf("%s\n", arr);
    return 0;
}

主要应用三步翻转法

i love you.

首先 将整体翻转 .uoy evol i

再将每个进行翻转 : .uoy----you.  evol----love    i-----i

再开始的时候定义两个指针 dest src

想使用 dest 指向每个小整体字符的第一个

            src指向每个小整体字符的最后一个

            在循环中触发为 src指向 '  '或者 '\0'

             prev是为了找到它的前一个 即每个小整体字符的最后一个

             src++后 指向新的小整体字符的第一个再次循环即可

src++时我们可以发现若最后'\0'进来不++
          在while循环判断就会结束
目录
相关文章
C4.
|
1月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
15 0
|
6月前
|
C语言
C语言——指针和数组练习题解析
C语言——指针和数组练习题解析
|
6月前
|
存储 编译器 C语言
数组、指针练习题及解析(含笔试题目讲解)其一(上)
数组、指针练习题及解析(含笔试题目讲解)其一
33 0
|
1月前
|
存储 C语言
C语言从入门到实战——数组和指针的强化练习题
C语言中指针和数组有着密切的关系,因为数组名在C语言中可以看作是一个指针常量。 指针是一个变量,存储的是另一个变量的地址。可以通过指针来访问另一个变量的值。指针变量可以存储任何类型的地址,包括数组的地址。 数组是一组相同类型的数据元素的集合。在C语言中,可以用数组名来表示整个数组,在这个意义上,数组名看起来像一个指针变量。实际上,数组名在C语言中可以看作是一个指向数组首元素的指针常量。
40 0
|
6月前
|
C语言
C语言之字符串的连接使用指针和调用函数两种方法
C语言之字符串的连接使用指针和调用函数两种方法
206 0
|
3月前
利用两个指针的差值求字符串长度
利用两个指针的差值求字符串长度
19 0
|
8月前
|
存储 C语言
C语言之指针(指针数组以及指针的指针和字符串)
C语言之指针(指针数组以及指针的指针和字符串)
70 0
|
9月前
|
人工智能 大数据 BI
指针及其应用2——数组指针、字符串指针
指针及其应用2——数组指针、字符串指针
|
4月前
|
C++
LeetCode | 双法妙解压缩字符串【遍历统计 + 双指针】
LeetCode | 双法妙解压缩字符串【遍历统计 + 双指针】
27 0
|
6月前
|
存储 C++
数组、指针练习题及解析(含笔试题目讲解)(二)
数组、指针练习题及解析(含笔试题目讲解)(二)
18 0