数据结构进阶实训三

Data structure advanced training course notes and algorithm exercises 数据结构进阶实训课程笔记和算法练习

Source Code: https://github.com/MysticalGuest/DataStructure/tree/master/AdvancedJuniorTraining



题目1

实现将一个字符串中的每个空格字符换成“%20”。
  - 例如:输入“We are happy.”, 则输出:
  - “We%20are%happy.”
要求在时间复杂度O(n),空间复杂度O(1)下完成。假设存放字符串的数组空间足够大。

1.1 算法设计思想

前提假设存放字符串的数组空间足够大;

第一次,遍历,计算出字符串长度,和替换后字符串长度;

i从原字符串末尾出发,j从新字符串末尾出发,遇到空格就替换为“%20”。

1.2 源代码

char str[100] = "We are happy.";    // 假设空间足够大
int length=0, blank=0, i, j;
while(str[length]!='\0'){
  printf("%c", str[length]);
  if(str[length]==' '){
    blank++;
  }
  length++;
}
length += 2 * blank;

i=length-2*blank;
j=length;

while(i>=0 && j>i){
  if(str[i]==' '){
    str[j--]='0';
    str[j--]='2';
    str[j--]='%';
  }
  else{
    str[j--]=str[i];
  }
  i--;
}

1.3 运行情况截图



题目2

数组中出现次数超过一半的数字已知数组中有一个数字其出现的次数超过了数组长度的一半,请找出这个数组。
要求:
  - 高效
  - 分析时空效率

2.1 算法设计思想

一个数字出现的次数超过了数组的一半,那么将其排序后,称为有序数列,中间的元素即为所求。

2.2 源代码

void sort(int a[], int length){
  int i, j, min, temp;
  for(i=0; i<length; i++){
    min=i;
    for(j=i; j<length; j++){
      if(a[min]>a[j])
        min=j;
    }
    if(min!=i){
      temp=a[min];
      a[min]=a[i];
      a[i]=temp;
    }
  }
}

printf("%d\n", array[length/2]);

2.3 运行情况截图



题目3

已知数组中的n个正数,找出其中最小的k个数。
要求:
  - 高效
  - 分析时空效率

3.1 算法设计思想

先将数组从小到大排序;

即可顺序打印出前k个数,即为数组中最小的k个数。

时间复杂度为O(n),空间复杂度为O(1)。

3.2 源代码

void sort(int a[], int length){
  int i, j, min, temp;
  for(i=0; i<length; i++){
    min=i;
    for(j=i; j<length; j++){
      if(a[min]>a[j])
        min=j;
    }
    if(min!=i){
      temp=a[min];
      a[min]=a[i];
      a[i]=temp;
    }
  }
}

printf("\nEnter the value k and output the smallest k number among them, k = ");
scanf("%d", &k);
printf("The smallest %d number in the array is: \n", k);
for(i=0; i<k; i++){
  printf("%d\t", array[i]);
}

3.3 运行情况截图


全部评论

相关推荐

04-20 22:20
已编辑
门头沟学院 算法工程师
27届,bg为四非本211硕,如题,导师不放实习,且每周至少一次线下组会(工作日),从研一上开始实习,然后我组在研一下引入了打卡机五段大厂分别是:美团到店、美团服务零售、快手电商、字节TikTok、字节CapCut。目前要结束我的第五段实习了(不会再刷第六段,好好搞学校的事,还有秋招)本来一直告诉自己的是“所有委屈到了终点再说”,过去告诉自己的终点自然还没到,但我觉得自己仿佛已经到了另一个终点,有感而发,写了这篇文章也许你会觉得为啥不尝试问问导师能不能实习,或者用其他让自己舒服的手段,我只能说,这很复杂,有导师的人自然会懂,这种一开始就把“利益冲突”摆明面上的招几乎就是不可能成功———————————————————我到底是怎么实习的?骗hr自己满勤,然后没有捷径,就是每周往返,第一段去的是北京美团,而学校在江苏,因此需要一周一次北京江苏往返,因为实习钱少,所以坐的基本是绿皮,难以入睡,下车后就是长达2小时的地铁去公司,地铁站上靠着人睡觉周末做什么?基本在做导师的科研or横向,学习的话很多时候就是尽力在晚上回到出租屋的时候学,这很难维持,但只能不断push自己如何破解打卡机?直接把打卡机偷了,或者使用指纹膜(当然我很早就做好了无法破解的准备,那就是找个长三角实习,每天早起去打卡完坐高铁去实习,从每周高铁往返变成每天)导师会压力吗?非常压力,实习的时候非常害怕微信弹出他的消息,PTSD了,有时候一周要往返两次学校,每次都跟要死了一样,之前真是情绪崩溃好几次,哈哈哈哈平时往返怎么平衡工作?我本来很晕车,为了不耽误公司和导师的进度,从车上一看电脑就头晕、吐,到后面可以随意在高铁、地铁、出租车上Coding,甚至不会再因为往返感到心累了,哈哈哈哈这一路已经淬炼出比较坚强的内心了,已经数不清多少次坐末班高铁从学校回公司,多少次凌晨6点爬起来赶车过去我会把这些当作是我人生的弯路,但现在,这些已经成为我宝贵的经验了。往后,我想我也能真正允许各种不好的情况出现了,因为我会真正把它当作我要解决的问题,而非抱怨,这又何尝不是终点呢?要照顾好身体,我不管怎么往返,一直非常在乎身体,会让自己睡够8小时,最近几星期培养早睡早起到公司健身后去工作的习惯,我觉得好身体很关键
gtgt..:很佩服,但是很恐怖,感觉已经从人类异化到高度运转的机器了
美团成长空间 2792人发布
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务