指针与字符串相关练习题

简介: 我们要考虑时间复杂度问题小于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.
|
6月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
68 0
|
6月前
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
49 0
|
6月前
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
37 0
C语言——指针和数组练习题解析
C语言——指针和数组练习题解析
|
存储 编译器 C语言
数组、指针练习题及解析(含笔试题目讲解)其一(上)
数组、指针练习题及解析(含笔试题目讲解)其一
109 0
|
6月前
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
47 0
|
6月前
|
算法 C语言
通过指针引用字符串
通过指针引用字符串
66 1
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
6月前
|
存储 C++
C++程序中的字符串与指针
C++程序中的字符串与指针
63 2
|
6月前
|
C语言
C语言指针与字符串
C语言指针与字符串
37 0