559-双指针思想解决数组问题

逃离我推掉我的手 2022-09-11 10:11 247阅读 0赞

将字符串逆序

采用双指针的思想
分别指向数组的首元素和末尾元素
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. //逆序字符串
  2. void Reverse(char arr[], int size)
  3. {
  4. char* p = arr;
  5. char* q = arr + size - 1;
  6. while (p < q)
  7. {
  8. char ch = *p;
  9. *p = *q;
  10. *q = ch;
  11. p++;
  12. q--;
  13. }
  14. }
  15. int main()
  16. {
  17. char arr[] = "hello world";
  18. Reverse(arr, strlen(arr));
  19. cout << arr << endl;
  20. }

整形数组,把偶数调整到数组的左边,把奇数调整到数组的右边

在这里插入图片描述
我们采用双指针的思想
在这里插入图片描述
我们要把右边的偶数放左边,左边的奇数放右边
p指针就是从最左边向右找奇数,然后q指针从右向左找偶数,当p从左向右找到1个奇数,q从右向左找到1个偶数,就把p指针指向的奇数和q指针指向的偶数一交换,这样一来,就把右边的偶数放左边,左边的奇数放右边了
在这里插入图片描述
在这里插入图片描述

处理交换完之后,p后移,q前移

在这里插入图片描述
然后重复刚才的过程。
直到p和q相遇,退出while循环。
在这里插入图片描述

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. using namespace std;
  6. //整形数组,把偶数调整到数组的左边,把奇数调整到数组的右边
  7. void AdjustArray(int arr[], int size)//接收数组的首地址,数组的个数
  8. {
  9. int* p = arr;
  10. int* q = arr + size - 1;
  11. while (p < q)
  12. {
  13. //p->从左向右找奇数
  14. while (p < q)
  15. {
  16. if ((*p & 0x1) == 1)//是奇数了,因为只有奇数的第一位是1
  17. {
  18. break;
  19. }
  20. p++;//是偶数,继续向后走
  21. }
  22. //q <- 偶数
  23. while (p < q)
  24. {
  25. if ((*q & 0x1) == 0)//是偶数
  26. {
  27. break;
  28. }
  29. q--;//是奇数,继续向前走
  30. }
  31. //p->奇数 q->偶数
  32. if (p < q)
  33. {
  34. int tmp = *p;
  35. *p = *q;
  36. *q = tmp;
  37. p++;
  38. q--;
  39. }
  40. }
  41. }
  42. int main()
  43. {
  44. int arr[10] = {
  45. 0 };
  46. srand(time(0));//每次运行随机数是不一样的,随系统时间不断变化
  47. for (int i = 0; i < 10; i++)
  48. {
  49. arr[i] = rand() % 100;
  50. }
  51. for (int v : arr)
  52. {
  53. cout << v << " ";
  54. }
  55. cout << endl;
  56. AdjustArray(arr, 10);
  57. for (int v : arr)
  58. {
  59. cout << v << " ";
  60. }
  61. cout << endl;
  62. }

在这里插入图片描述

移除元素问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把val值的元素都调整到末尾
我们采用双指针的思想
在这里插入图片描述
在这里插入图片描述
我们就是把右边残留的不等于val的元素的值放到左边等于val的元素上
返回的数组的长度就是p移动到的位置减去数组的首地址
q从右向左找不等于val的元素, p从左向右找等于val的值,如果找到,就q解引用赋值给p的解引用
在这里插入图片描述
在这里插入图片描述
p==q,这个元素也是要判断的。如果这个元素等于val值3,这个值就不记录,p-首元素地址=1,长度就是1,没有问题。如果这个值不等于val,p还要往后加一下
在这里插入图片描述
不满足while的条件,跳出,所以我们的while条件要修改一下(p<=q)
在这里插入图片描述
p-首元素地址=2,刚好是2,2,长度是2

在这里插入图片描述
优化代码一下
在这里插入图片描述

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,247人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数组指针技巧

    双指针技巧 —— 情景一 在前一章中,我们通过迭代数组来解决一些问题。通常,我们只使用从第一个元素开始并在最后一个元素结束的一个指针来进行迭代。 但是,有时候,我们可能需