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 hereint 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;}}
}

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

  1. 牛客题霸 [合并两个有序的数组] C++题解/答案

    牛客题霸 [合并两个有序的数组] C++题解/答案 题目描述 给出两个有序的整数数组 和 ,请将数组 合并到数组 中,变成一个有序的数组 注意: 可以假设 数组有足够的空间存放 数组的元素, 和 中初 ...

  2. [C++] 牛客网:合并两个有序的数组

    主要是体验一下牛客网里的核心代码模式到底是怎么弄的..还有C++这个东西平常用的太少了,试一试. 以外的还体验到了sort()函数的使用. 来源:牛客网 题目链接:合并两个有序的数组 知识点:数组.双 ...

  3. 算法001:合并两个有序的数组

    写在开头:这是自己的第001道算法题,来源于牛客网(地址:题目地址),分享自己的解题思路.来借此鼓励自己学习算法并坚持下去! 首先来看一下题目描述: 需要用到的知识点: 数组 + 双指针 下列代码已经 ...

  4. 牛客题霸 NC22 合并两个有序的数组

    https://www.nowcoder.com/practice/89865d4375634fc484f3a24b7fe65665 解决方案 Go func merge(A []int, m int ...

  5. c语言数据结构判断回文数,C++数据结构与算法之判断一个链表是否为回文结构的方法...

    本文实例讲述了C++判断一个链表是否为回文结构的方法.分享给大家供大家参考,具体如下: 题目: 给定一个链表头节点head,请判断是否为回文结构 例如: 1->2->1 true 1-&g ...

  6. 2023牛客寒假算法基础集训营4_20230130「向上取整」「夹逼dp」「lowbit科学+树状数组性质」「搜索」「倍增跳表」「莫队」

    6/13 教育场是有被教育到.(预计会鸽几题. 已过非太水的题们 //B //https://ac.nowcoder.com/acm/contest/46812/B//小构造小数学#include & ...

  7. 牛客网刷题-合并两个有序数组

    前言: 想要学好嵌入式,C语言与数据结构是必要熟练掌握的,而想熟练掌握一门语言,必须经过大量的练习,刷题,至少需要一两万行的代码量,才能具有一定的编程能力,至少拿到一个功能,怎么去用编程语言去实现它, ...

  8. 算法记录 牛客网 leetcode刷题记录

    算法记录 & 牛客网 & leetcode刷题记录 解题思路 STL容器 常用算法模板 堆排序 插入排序 快速排序 BFS层序遍历 二叉树 JZ55 二叉树的深度 BST(binary ...

  9. 2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

    1.A-智乃的Hello XXXX 签到 #include<bits/stdc++.h> using namespace std; int main(){cout<<" ...

最新文章

  1. python中choicebox_学习python的第四天笔记
  2. 【转载】SharpDevelop代码分析
  3. docker 多阶段构建
  4. 数据结构--图 Graph
  5. java配置环境及安装
  6. CToolBarCtrl工具栏设置总结(转)
  7. 谈谈linux内核原理,谈谈Linux内核驱动的coding style
  8. 顺序存储结构与链式存储结构的比较
  9. win7图片查看器无法显示图片,内存不足解决方法
  10. 图解PKCS#1——第四部分 签名验签方案
  11. python最小二乘法_最小二乘法(least sqaure method)
  12. android系统 PowerManager深入分析(非常详细)
  13. 面试官问出这几道算法题,你能扛住么?
  14. C/C++程序内存布局(data段,bss段,text段)以及static关键字详解
  15. 王叁寿:大数据是传统信息化厂商的掘墓人
  16. 智能化实验室设计是什么
  17. MSN登陆后死机的解决方案
  18. 问答系统javaweb
  19. 五只猴子分桃子问题(编程法和不编程法)
  20. Android中区分滑动和点击操作

热门文章

  1. python使用openslide包打开.svs图像
  2. 阿里云服务器定时跑python_Python实现定时任务
  3. 基于人货场内容的产品设计攻略
  4. 我爱作业20230305
  5. 扫盲:SSL和TSL的区别【转】
  6. python 操作Excel(4) to_excel 保存 excel
  7. com_error: (-2147221008, '\xc9\xd0\xce\xb4\xb5\xf7\xd3\xc3 CoInitialize\xa1\
  8. 独立博客、文档类网站消亡倒计时
  9. python统计奇数和偶数的个数_Python 统计位数为偶数的数字代码详解
  10. 手机之间的“间谍战”-巧用“蓝牙间谍”遥控远程手机