简单记录牛客top101算法题(初级题C语言实现)判断回文字符串 反转字符串 合并两个有序的数组

news2024/12/28 10:39:34

1. 判断是否为回文字符串

  给定一个长度为 n 的字符串,请编写一个函数判断该字符串是否回文。如果是回文请返回true,否则返回false。
  字符串回文指该字符串正序与其逆序逐字符一致。

//示例
输入:"ranko"
返回值:false

1.1 整体思路

  1. 统计字符串个数。
  2. 遍历字符串,首尾依次比较字符是否相等
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
bool judge(char* str ) {
   int n = 0;              //统计字符串个数
   n = strlen(str);        //计算字符串个数
   char *p1 = &str[0];      //声明开始指针
   char *p2 = &str[n-1];    //声明结束指针,数组索引是从0开始的
    for(int i = 0; i < n / 2; i++) {
        if (*(p1 + i) != *(p2 - i)) {
            return false;
        }
     }
     return true;
  }
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
bool judge(char* str ) {
	int n = 0;
       while (*(str + n) != '\0') {     //统计字符串的个数
        n++;
    }
  for (int j = 0; j < n /2; j++) {                         //只取一半的值遍历       
       if( *(str + j) !=  *(str + n - 1- j) ){            //对称判断字符是否相等 
             return  false;
           } 
        }
     return  true;
}

备注:
  以字符串数组5个元素为例子,5 / 2 = 2,i能取到的值就是0和1(前两个元素),所以从尾开始算起的话,也是取了最后一个元素和倒数第一个元素(后两个元素);
  以字符串数组6个元素为例子,5 / 2 = 3,i能取到的值就是0和1和2(前三个元素),所以从尾开始算起的话,也是取了最后一个元素、倒数第一个元素和倒数第二个元素(后三个元素);

1.2 小结

  1. 声明字符和字符串。
//声明字符
 char  c = 'A';

//声明字符串
 char  str[] = "abadon";      //声明字符串就是字符数组

2.数组指针

char  str[] = "abadon"; 
  str                 //数组名称代表数组元素首地址,即指针
  str[0] = *(str + 0);
  str[i] = str[0 + i] = *(str + i);      //[]和*相当于是等价的

3.统计字符串大小

//使用strlen()函数
int n = 0;              //统计字符串个数
n = strlen(str);        //计算字符串个数

//使用while循环统计
int n = 0;
   while (*(str + n) != '\0') {     //统计字符串的个数
       n++;
    }

4.布尔数据类型打印

   //c语言中的bool型就是0和1,因此可以用%d输出
   bool  b = true;
   printf("%d\n",b)


2. 反转字符串

  写出一个程序,接收一个字符串,然后输出该字符串反转后的字符串。

输入:"abcd"
返回值:"dcba"

2.1 整体思路

  1. 统计字符串个数。
  2. 遍历字符串,首尾依次互换字符位置。
#include <stdlib.h>
#include <string.h>
char* solve(char* str ) {
    // write code here
    int n = 0;
    n = strlen(str);
    // char* str1 = (char*)malloc(sizeof(char) * n );       //申请动态数组
    char c;            //声明中间变量

    for (int i = 0; i < n / 2 ; i++) {
           c = *(str + i);         //中间变量接收前面字符
          *(str + i) = *(str + n -1 -i);   //前面字符接收后面字符
          *(str + n -1 -i) = c;     //后面字符接收中间变量,也就是前面字符
    }
    return str;
}

整体思想和上面一题思想差不多。

3. 合并两个有序的数组


      在这里插入图片描述
  自己的思路:根据提交后报的错误,可以把具体情况分为一下几种,先判断B数组是否为空,如果为空,则不需要任何其他的操作;如果不为空,再分为以下三种情况进行讨论:

  1. 如果A数组的最小值大于等于B数组的最大值(就是4,5,6 1,2,3这种情况),只需要把A数组的值移动到后面,把B数组的值移动到A数组开始值的位置即可;
  2. 如果A数组的最大值小于等于B数组的最小值(就是1,2,3 4,5,6这种情况),只需要在A数组的后面追加B数组的值即可;
  3. 如果除上面两种情况外,都归属于第三种情况(如1,7,9 2,8,5这种情况),需要遍历B数组,与A数组中的每一个值进行比较,如果B数组的元素值比A数组的值小,则交换两者的位置,这样一圈下来,A是前面m个数的顺序已经排好了,B数组的顺序没有排列,所以只需要排列B数组的顺序即可(这里是使用了选择排序)。
      初始值: 1 7 9 2 8 5
      第一次: 1 2 9 7 8 5
      第二次: 1 2 7 9 8 5
      第三次: 1 2 7 8 9 5
      第四次: 1 2 7 5 9 8
      第四次: 1 2 7 5 8 9
/**
 *
 * @param A int整型一维数组
 * @param ALen int A数组长度
 * @param B int整型一维数组
 * @param BLen int B数组长度
 * @return void
 */
#include <stdio.h>
#include <string.h>
void merge(int* A, int ALen, int m, int* B, int BLen, int n) {

    int c = 0;
    int isEmpty = 1;
    for (int i = 0; i < n; i++) {
        if (B[i] != 0) {
            isEmpty = 0;         //代表非空
            break;
        }
    }
    if ( isEmpty == 0 ) {
        if (A[0] >= B[n-1]) {                            //如果A的最小大于B的最大值(就是4,5,6   1,2,3这种情况),索引一定要减去1
            //先把前面的移出去,移到后面去
            for ( int k = 0 ; k < m;  k++) {
                A[m + k] = A[k];                     //A[4] = A[0]
            }
            //先把后面的移出去,移到后面去
            for (int k = 0 ; k < n;  k++) {
                A[k] = B[k];
            }
        } else if (A[m - 1] <= B[0]) {                    //如果A的最大值小于B的最小值(就是1,2,3   4,5,6这种情况),
            for ( int k = 0 ; k < n;  k++) {
                A[m + k] = B[k];                    //A[4] = A[0]
            }
            printf("value0 = %d\r\n",100);
        } else {                                        //这里以1,2,3  2,5,6为例        先比较B[0]的大小
            for (int i = 0; i < n; i++) {               //遍历B中的每一个元素
                for (int j = 0; j < m; j++) {        //遍历A中的元素
                    if (A[j] > B[i]) {               //A中的元素值大于B中的原始,换两者的位置
                        c = A[j];                    //接收A[j]的值
                        A[j] = B[i];
                        B[i] = c;
                    }
                }
            }
            printf("value1 = %d\r\n",100);
            //遍历数组B,把B排一下
            for (int h = 0; h < n; h++) {               //使用冒泡排序法
                for (int l = h + 1; l < n; l++) {           //
                    if ( B[h] >  B[l]) {
                        c = B[h];
                        B[h] = B[l];
                        B[l] = c;
                    }
                }
            }
            //拼接整个数组
            for ( int k = 0 ; k < n;  k++) {         //数组前半部分不动,把B的值放到A的后面
                A[m + k] = B[k];                    //A[4] = A[0]
            }
        }
    }
}

  看大佬的思路:
1.从确定最大值开始,以B和A的尾索引来计,逐个比较,如果大就放到新数组A的尾部,依次进行,这样就不用遍历进行数组元素换位置了。

int len =  m + n -1;     //数组总长度
int endA = m - 1;        //数组A的长度
int endB = n - 1;        //数组B的长度
 while (endA >= 0 && endB >= 0) {        //A和B都存在的情况

        if (A[endA] >= B[endB]) {
            A[len] = A[endA];
            len--;
            endA--;
        }else {
            A[len] = B[endB];
            len--;
            endB--;
        }
}
  while (endB >= 0){                  //A数组不存在情况或者B数组不存在这两种情况都包含了
       A[len] = B[endB];
       len--;
       endB--;
 }

   2.先将B数组的全部拼接到A数组的后半部分,再对整体进行冒泡排序。

for (int i = 0; i < n; i++) {    //拼接两个数组
    A[m + i] = B[i];
}
for (int j = 0; j < m + n ; j++) {              //冒泡排序
   for (int k = 0; k < m + n - 1 - j; k++ ){ 
    if (A[k]  > A[k+1]) {
        c = A[k];
        A[k] = A[k+1];
        A[k+1] =c;
    }
   }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DevOps系列文章之 自动化测试大全(单测和集成测试)

自动化测试业界主流工具 核心目标&#xff1a; 主要是功能测试和覆盖率测试 业界常用主流工具 GoogleTest GoogleTest是一个跨平台的(Liunx、Mac OS X、Windows 、Cygwin 、Windows CE and Symbian ) C单元测试框架&#xff0c;由google公司发布&#xff0c;为在不同平台上为编…

案例:缺陷个数与返工工作量强相关

某公司积累了21个项目缺陷个数与返工工作量的数据&#xff0c;如下表所示&#xff1a; 项目序号缺陷修复工时缺陷数1943314452299040536347446471385496071061370246774066812232189276652810830213781162678126111511381110514209032015144023516516078417710010301875601239…

3.Makefile变量的用法(附示例)

一、本节概要 本专栏所有内容围绕Makefile官方文档进行刨析,给出详细具体示例做辅助理解手撕Makefile官方手册 二、Makefile中的变量 1、没有使用变量的makefile 以下是不使用变量的makefile完整示例: edit: main.o kbd.o command.o display.o insert.o search.o files…

django channels实战(websocket底层原理和案例)

1、websocket相关 1.1、轮询 1.2、长轮询 1.3、websocket 1.3.1、websocket原理 1.3.2、django框架 asgi.py在django项目同名app目录下 1.3.3、聊天室 django代码总结 小结 1.3.4、群聊&#xff08;一&#xff09; 前端代码 后端代码 1.3.5、群聊&#xff08;二&#xff09…

网络编程 IO多路复用 [epoll版] (TCP网络聊天室)

//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 通过IO多路复用实现服务器在单进程单线程下可以与多个客户端交互 API epoll函数 #include<sys/epoll.h> int epoll_create(int size); 功能&#xff1a;创建一个epoll句柄//创建红黑树根…

TypeScript算法题实战——剑指 Offer篇(5)

目录 一、平衡二叉树1.1、题目描述1.2、题解 二、数组中数字出现的次数2.1、题目描述2.2、题解 三、数组中数字出现的次数 II3.1、题目描述3.2、题解 四、和为s的两个数字4.1、题目描述4.2、题解 五、和为s的连续正数序列5.1、题目描述5.2、题解 六、翻转单词顺序6.1、题目描述…

《cuda c编程权威指南》01- 用gpu输出hello world

学习一门新语言的最好方式就是用它来编写程序。 目录 1. 使用cpu输出hello world 2. 使用gpu输出hello world 3. CUDA编程结构 1. 使用cpu输出hello world hello.cu #include <stdio.h>void helloFromCPU() {printf("hello world from cpu!\n"); }int m…

Zabbix分布式监控配置和使用

目录 1 Zabbix监控的配置流程2 添加主机组3 添加模板4 添加主机5 配置图形6 配置大屏7 新建监控项7.1 简介7.2 添加监控项7.3 查看数据7.4 图表 8 新建触发器8.1 概述8.2 添加触发器8.3 显示触发器状态 1 Zabbix监控的配置流程 在Zabbix-Web管理界面中添加一个主机&#xff0c;…

【Golang 接口自动化00】为什么要用Golang做自动化?

目录 为什么使用Golang做自动化 最终想实现的效果 怎么做&#xff1f; 写在后面 资料获取方法 为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后&#xff0c;因为没有太多时间和项目来实践&#xff0c;怕止步于此、步Java缺少练习遗忘殆尽的后尘&#xff0c;决定…

【C++进阶之路】多态篇

文章目录 前言一、概念1.分类2.实现条件①重写虚函数1.1总结三重1.2 final与override ②父类的指针或者引用2.1普通调用VS多态调用 3.抽象类3.1. 纯虚函数3.2. 接口继承和实现继承 二、原理及使用1.虚函数表 —— 虚表2.默认成员函数2.1构造函数2.2析构函数 3. 多继承3.1普通的…

python速成之循环分支结构学习

循环结构 应用场景 我们在写程序的时候&#xff0c;一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球&#xff0c;如果机器人持球而且还没有进入射门范围&#xff0c;那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中&#xff0c;让…

AD21原理图的高级应用(六)原理图设计片段的使用

&#xff08;六&#xff09;原理图设计片段的使用 Altium Designer 的片段功能可以很方便地重复使用一些单元模块,其中包括原理图的电路模块、PCB(包括布线)和代码模块。例如在工程中需要设计电源模块,而别的工程中又恰好有比较完善的电源模块,这时就可以通过片段功能重复地使用…

一文了解 Android 车机如何处理中控的旋钮输入?

前言 上篇文章《从实体按键看 Android 车载的自定义事件机制》带大家了解了 Android 车机支持自定义输入的机制 CustomInputService。事实上&#xff0c;除了支持自定义事件&#xff0c;对于中控上常见的音量控制、焦点控制的旋钮事件&#xff0c;Android 车机也是支持的。 那…

测试|测试用例方法篇

测试|测试用例方法篇 文章目录 测试|测试用例方法篇1.测试用例的基本要素&#xff1a;测试环境&#xff0c;操作步骤&#xff0c;测试数据&#xff0c;预期结果…2.测试用例带来的好处3.测试用例的设计思路&#xff0c;设计方法&#xff0c;具体设计方法之间的关系**设计测试用…

linux设备驱动的poll与fasync

什么是fasync 在 Linux 驱动程序中&#xff0c;fasync 是一种机制&#xff0c;用于在异步事件发生时通知进程。它允许进程在等待设备事件时&#xff0c;不必像传统的轮询方式那样持续地查询设备状态。 具体来说&#xff0c;当进程调用 fcntl(fd, F_SETFL, O_ASYNC) 函数时&am…

lib-flexible修改配置适配更多不同分辨率

找到设置宽度的地方 然后根据你的屏幕最大多大呀&#xff0c;最小多小呀设置一下 if (width / dpr < 1980) { width 1980 * dpr; } else if (width / dpr > 5760) { width 5760 * dpr; }

Python 教程之标准库概览

概要 Python 标准库非常庞大&#xff0c;所提供的组件涉及范围十分广泛&#xff0c;使用标准库我们可以让您轻松地完成各种任务。 以下是一些 Python3 标准库中的模块&#xff1a; 「os 模块」 os 模块提供了许多与操作系统交互的函数&#xff0c;例如创建、移动和删除文件和…

【Linux】进程篇Ⅱ:进程开始、进程终止、进程等待

文章目录 五、fork 函数&#xff0c;创建进程写时拷贝 六、进程终止1. 退出码2. 如何终止程序 七、进程等待1. 概念2. wait 函数waitpid 函数 &#x1f53a; 3. 阻塞等待 五、fork 函数&#xff0c;创建进程 #include <unistd.h>   pid_t fork(void);   返回值&#xf…

动态SQL 语句-更复杂的查询业务需求也能轻松拿捏

文章目录 动态SQL 语句-更复杂的查询业务需求动态SQL-官方文档为什么需要动态SQL动态SQL-基本介绍基本介绍动态SQL 必要性解决方案分析 动态SQL 常用标签动态SQL-案例演示if 标签应用实例where 标签应用实例choose/when/otherwise 应用实例forEach 标签应用实例trim 标签应用实…

【C语言进阶篇】 你真的学会数组了嘛?数组笔试题万字解析(上)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 数组笔试题解析&#x1f4ad; 一维数组笔试题✅ 一维数组笔试题解析✅ 一维数…