笔试强训之每日一题(二)

x33g5p2x  于2022-02-07 转载在 其他  
字(1.9k)|赞(0)|评价(0)|浏览(286)

笔试强训每日一题(二)

排序子序列

题目链接

题目描述

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

首先我们要理解非递减和非递增:

非递减就是a[i]<=a[i+1],递减就是a[i]>a[i+1]

非递增就是a[i]>=a[i+1],递增就是a[i]<a[i+1]

题目解析

  1. 本题依次比较整个数组
  2. a[i+1]>a[i],则进入非递减序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位置的判断
  3. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位置的判断
  4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减序列。
  5. 本题需要注意的是开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n] = 0

解题代码

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. cin>>n;
  8. vector<int> a;
  9. a.resize(n+1);
  10. for(int i = 0;i<a.size()-1;i++)
  11. {
  12. cin>>a[i];
  13. }
  14. a[n] = 0;
  15. //数组当中已经存在数字
  16. // 1 2 3 3 4 5
  17. int i = 0;
  18. int count = 0;
  19. while(i<n)
  20. {
  21. if(a[i] < a[i+1])
  22. {
  23. //进入非递减序列
  24. //注意i的值要注意不能一直加
  25. //当序列是1 2 3时,这里会有越界,但是牛客网的测试用例有问题,这个代码竟然能过
  26. while(i < n && a[i] <= a[i+1])
  27. {
  28. //在非递减序列中
  29. i++;
  30. }
  31. //这里出来说明一个非递减序列,count++
  32. count++;
  33. i++;
  34. }
  35. else if(a[i] == a[i+1])
  36. {
  37. i++;
  38. }
  39. else
  40. {
  41. //进入非递增序列
  42. //注意i的值要注意不能一直加
  43. while(i < n && a[i] >= a[i+1])
  44. {
  45. //在非递增序列中
  46. i++;
  47. }
  48. //这里出来说明一个非递增序列,count++
  49. count++;
  50. i++;
  51. }
  52. }
  53. cout<< count <<endl;
  54. }

倒置字符串

题目链接

题目描述

将一句话的单词进行倒置,标点不倒置。比如l like beijing.经过函数后变为: beijing. like l

输入描述:
每个测试输入包含1个测试用例: I like beijing.输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割

题目解析

  1. 空格是单词的结束标志
  2. 遇到空格逆置单词:i ekil .gnijieb
  3. 逆置全部:beijing. like i

解题代码

  1. #include<string>
  2. #include<iostream>
  3. using namespace std;
  4. //将一句话的单词进行倒置,标点不倒置
  5. //空格是单词的标志
  6. void reverse(string &str,int begin,int end)
  7. {
  8. while(begin<end)
  9. {
  10. char temp = str[begin];
  11. str[begin] = str[end];
  12. str[end] = temp;
  13. begin++;
  14. end--;
  15. }
  16. }
  17. void reverse_word(string &str)
  18. {
  19. //1.遇到空格逆置单词
  20. //i ekil .gnijieb
  21. //2.逆置全部
  22. //beijing. like i
  23. int i = 0;//记录逆置单词的起始
  24. int j = 0;//找单词的结尾
  25. for(int j = 0;j <= str.size();j++)
  26. {
  27. if(str[j] == ' '||str[j] == '\0')
  28. {
  29. reverse(str,i,j-1);
  30. i = j + 1;
  31. }
  32. }
  33. reverse(str,0,str.size()-1);
  34. }
  35. int main()
  36. {
  37. string str;
  38. getline(cin,str);
  39. //1.遇到空格逆置单词
  40. //i ekil .gnijieb
  41. //2.逆置全部
  42. //beijing. like i
  43. reverse_word(str);
  44. cout<<str<<endl;
  45. }

相关文章