再做决定之前,我还是做好自己该做的。我不希望几年后会悔恨自己为什么在最该努力的时候不愿意吃苦。尊敬的女王陛下,请接题:

一.题目:有已按升序排好顺序的字符串a,编写程序将字符串s中的每个字符按升序的规则插到字符串a中,最后输出”abdefghjkmnptwy”。

二.思路:既然是已经排好序的,就用二分法查找的思想

将字符串s中的每个字符依次作为key拿来和字符串a做比较并且插入

三.程序

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 #define SIZE 50
 5
 6 void InsertStr(char *s,char *a,int low,int high)
 7 {
 8     int mid = 0;
 9
10     while(*a)
11     {
12        mid = (low+high)/2;
13
14        //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时
15        if((s[mid]<*a) && (s[mid+1]>*a) || s[mid]==*a)
16        {
17            for(int j=mid+1;*(s+j);j++)
18            {
19                s[j] = *a;//把*a插入到字符串s中mid+1的位置
20                s[j+2]=s[j+1];//并且字符串s从mid+2开始的位置全部往后挪一个位置
21                high = high +1;//若每插入一个*a字符,则右区间要加1
22            }
23        }
24        else if(s[mid] >*a)
25        { //若mid位置对应的字符大于*a,则右区间变为mid
26            high = mid;
27            InsertStr(s,a,low,high);
28        }
29        else if(s[mid] <*a)
30        { //若mid位置对应的字符小于*a,则左区间变为mid
31            low = mid;
32            InsertStr(s,a,low,high);
33
34        }
35
36        a++;
37     }
38
39
40 }
41
42
43 int main(void)
44 {
45     char s[SIZE]={0};
46     char a[SIZE]={0};
47
48     printf("Please input the s string:\n");
49     scanf("%s",s);
50     printf("Please input the a string:\n");
51     scanf("%s",a);
52
53     InsertStr(s,a,0,strlen(s));
54     printf("%s",s);
55
56     return 0;
57
58 }

三.编译运行

程序出错

四.分析问题

1.在插入字符串那个if条件语句里,犯了一个错误:往后面挪的时候,前面的已经把后面的覆盖了,比如a[6]=a[5],然后a[7]=a[6],看到没,这个时候a[6]已经被a[5]覆盖了,它再往后挪都不是自己原来的值了,所以要从最后面开始挪,这样才不会被覆盖。

2.*a可以肯定的是插在s[mid+1]的位置,所以直接s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置就可以了,不然s[mid+1]的值会被*a覆盖

3.每插入一个字符都需要重新获取high

五.程序

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 #define SIZE 50
 5
 6 void InsertStr(char *s,char *a,int low,int high)
 7 {
 8     int mid = 0;
 9
10     while(*a)
11     {
12
13        mid = (low+high)/2;
14
15        //当mid位置字符<*a<mid+1位置字符或者mid位置字符等于*a时
16        if((s[mid]<*a) && (s[mid+1]>*a) || s[mid]==*a)
17        {
18            for(int j=strlen(s)-1;j>=mid+1;j--)
19            {
20                s[j+1]=s[j];//并且字符串s从mid+2开始的位置全部往后挪一个位置
21            }
22            s[mid+1]=*a;//把*a插入到字符串s中mid+1的位置
23
24        }
25        else if(s[mid] >*a)
26        { //若mid位置对应的字符大于*a,则右区间变为mid
27            high = mid;
28            InsertStr(s,a,low,high);
29        }
30        else if(s[mid] <*a)
31        { //若mid位置对应的字符小于*a,则左区间变为mid
32            low = mid;
33            InsertStr(s,a,low,high);
34
35        }
36
37        a++;
38        high =strlen(s);//每个字符串a都要重新获取s字符串的长度
39     }
40
41
42 }
43
44
45 int main(void)
46 {
47     char s[SIZE]={0};
48     char a[SIZE]={0};
49
50     printf("Please input the s string:\n");
51     scanf("%s",s);
52     printf("Please input the a string:\n");
53     scanf("%s",a);
54
55     InsertStr(s,a,0,strlen(s));
56     printf("%s",s);
57
58     return 0;
59
60 }

还是无法跳出InsertStr()函数,突然记起来要在函数末尾加一个return

1        a++;
2        high =strlen(s);//每个字符串a都要重新获取s字符串的长度
3     }
4
5     return;
6 }

真的可以跳出来了,但是却还是有问题,现在这样的运行结果是

六.到底哪里出了问题呢?

七.给出网上的解答版本

 1 #include<stdio.h>
 2 #include<string.h>
 3 void main()
 4 {
 5         char a[20]="bdfhjmptwy";        //升序
 6         char s[ ]="ganke";
 7         char *p1=a,*p2=s,*p=NULL;
 8         while(*p2)
 9         {
10             while(*p1)
11             {
12                 if(*p2>*p1) p1++;
13                 else break;//要有出口!!!!
14             }
15             p=p1;//保存指针的位置!!!
16             while(*p1) p1++;
17             while(p1!=p)
18             {
19                 *(p1+1)=*p1;
20                 p1--;
21             }
22             *(p1+1)=*p1;
23             *p=*p2;
24             p2++;
25             p1=a;//指针复原很重要!!!!
26         }
27         puts(a);
28 }

八.对比

那,鉴于你有这样的毅力,明天犒劳你一个又红又脆的苹果+一盒特仑苏纯牛奶哇~

转载于:https://www.cnblogs.com/TTTTT/p/3731240.html

C语言每日一题之No.9相关推荐

  1. 【C语言每日一题】——猜凶手

    [C语言每日一题]--猜名次

  2. C语言每日一题:青蛙跳楼梯(学习笔记自用)

    今天做了一道csdn上的题,即一个青蛙一次能跳1或2个梯子,请问他跳n阶梯子有多少种跳法?我当时一开始用的是数学排列组合里的分类计算法,先计算全部一个一个跳.又一次跳了两个.两次跳了两个...后来在看 ...

  3. C语言每日一题之No.12

    文件操作知识:如何将一个文件的内容读取到另一个文件里? fread函数和fwrite函数 1.函数功能   用来读写一个数据块. 2.一般调用形式   fread(buffer,count,size, ...

  4. C语言每日一题——查找数字

    在一组"有序"数组中查找某个数字,如果找到返回其下表,如果没有找到,输出"不存在". 一,遍历查找 就是将所有数都遍历一遍 找是否存在该数字如果存在返回下标 具 ...

  5. C语言每日一题——数字金字塔

    如果有同学问你,"你会用代码打印出,数字金字塔吗?" 如果你阅读了这篇文章你将,会十分自信的去告诉他,这都小意思. //数子金字塔 //1//01(0代表空格 方便演示) //12 ...

  6. 【C语言每日一题】验证尼科彻斯定理

    ✨✨ 题目:验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和. 例如: 1^3=1 2^3=3+5 3^3=7+9+11 4^3=13+15+17+19 输入一个正整数m(m≤10 ...

  7. C语言每日一题——求年龄(周岁)

    你真的了解你自己吗 你知道你现在几岁了吗 你能准确说出来吗 我看你不怎么知道那我就用代码来告诉你 你究竟多岁? 代码演示: 请小伙伴自由评论,加油铁汁~

  8. C语言每日一题-PTA基础编程题-7-28 猴子选大王

    7-28 猴子选大王 (20分) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻 ...

  9. 【C语言蓝桥杯每日一题】—— 单词分析

    [C语言蓝桥杯每日一题]-- 单词分析

最新文章

  1. 在html中引用css样式表,怎么引用css样式?
  2. dr. unarchiver_P160 四季可穿,数仙女尽折腰!醉高版本Dr马丁靴女2020秋冬新款牛筋底1460英伦风8孔系带复古机车军靴真皮短靴马丁靴...
  3. 【NLP】一文搞懂NLP中的对抗训练
  4. mysql的基本数据类型_mysql基本数据类型(mysql学习笔记三)
  5. php 验证码一直不对,ThinkPHP验证码老是出错怎么办
  6. C语言之原码、反码和补码
  7. python的reduce()函数
  8. 【转】SpringMVC整合websocket实现消息推送及触发
  9. python物理模拟.pdf_用Python物理建模的第一本书终于来啦
  10. 计算机监控系统英文缩写,各弱电系统英文缩写
  11. 骑士人才linux伪静态,骑士CMS人才系统伪静态的设置方法
  12. The OCD Brain: how animal research helps us understand a devastating condition
  13. 聪明的人脸识别4——Pytorch 利用Retinaface+Facenet搭建人脸识别平台
  14. 夺冠之夜,荣耀的坚守和变通
  15. linux mac地址远程开机,用MAC地址远程开机的开机棒你见过吗?
  16. 大数据开发,真的这么香吗?
  17. 学习Vue3 第五章(Vue核心虚拟Dom和 diff 算法)
  18. 光耦隔离前后电阻阻值选择注意事项
  19. 17岁高中生证明著名数学难题,因此被MIT录取
  20. 人机大战引关注 人工智能概念股有望受追捧

热门文章

  1. JZOJ 5924. 【NOIP2018模拟10.23】Queue
  2. JZOJ 5068. 【GDSOI2017第二轮模拟】树
  3. mysql试题百度云_BATJ大厂600多道技术面试题及答案解析
  4. 设备树与驱动的关系_Linux CommonClock Framework分析之四 gpio clk gate驱动实现
  5. 程序异常是python语言基本控制结构_计算机二级python 知识点篇(程序的控制结构)...
  6. LPS25HB 气压计 参考手册中关于FIFO功能的解读
  7. ACM竞赛学习整理开篇之01背包问题
  8. map怎么转化dto_java实现Object和Map之间的转换3种方式
  9. tomcat 外网访问不了_免费云服务器/jdk环境配置/Tomcat简单配置
  10. php.ini文件可以复制吗,php安装完成以后要复制php.ini文件