数组练习之二分查找和多个字符从两端向中间汇聚

简介: 数组练习之二分查找和多个字符从两端向中间汇聚

多个字符从两端移动,向中间汇聚

       实现思路:定义两个字符数组,将要移动的字符数组元素赋值给另一个数组元素,实现多个字符行两端向中间汇聚。(sizeof,strlen详解:sizeof,sizeof与strlen的区别-CSDN博客

数组:)

#include<stdio.h>
#include<string.h>//strlen的头文件
int main()
{
  char arr1[] = "hello world!!!";
  char arr2[] = "**************";
  int left = 0;
  int right = strlen(arr1) - 1;//数组元素下标,也可以用(sizeof(arr1)/sizeof(arr2))-2
  printf("%s\n", arr2);
  while (left <= right)
  {
    arr2[left] = arr1[left];
    arr2[right] = arr1[right];
    left++;
    right--;
    printf("%s\n", arr2);
    
  }
  return 0;
}

        上述代码打印结果是一瞬间的。经过下述改良之后,打印结果有时间间隔,且会清理上次打印结果,给人一种逐步打印的感觉,也展示了多个字符从两端移动,向中间汇聚的整体过程。宝宝们下来可以尝试一下。

下述代码会停顿1s打印:(Sleep函数可以控制程序的执行速度,该函数的参数类型为unsigned int,不是浮点数类型)

#include<stdio.h>
#include<string.h>//strlen的头文件
#include<windows.h>//Sleep的头文件
#include<stdlib.h>//system的头文件
 
 
int main()
{
  char arr1[] = "hello world!!!";
  char arr2[] = "**************";
  int left = 0;
  int right = strlen(arr1) - 1;//数组元素下标,也可以用(sizeof(arr1)/sizeof(arr2))-2
  printf("%s\n", arr2);
  while (left <= right)
  {
    Sleep(1000);//单位mms,这里停顿1s打印
    arr2[left] = arr1[left];
    arr2[right] = arr1[right];
    left++;
    right--;
    printf("%s\n", arr2);
    
  }
  system("cls");//清理屏幕上的信息
  printf("%s\n", arr2);//while循环打印的所有内容被清理之后,最后打印一次
  return 0;
}

最后显示在屏幕上的内容:

二分查找 (也叫折半查找)

       在一个升序数组中查找指定的数字n,很容易想到的就是遍历数组。接下来,我们就看看使用遍历数组的方法找指定的数字:

#include<stdio.h>
int main()
{
  int arr[]= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  int i = 0;
  int k = 7;//在数组中找7
  int sz = sizeof(arr)/sizeof(arr[0]);//数组元素个数
  int find = 0;
  for (i = 0; i < sz; i++)
  {
    if (k == arr[i])
    {
      printf("找到了,下标是%d\n", i);
      find = 1;
      break;
    }
  }
  if (find == 0)
  {
    printf("找不到了\n");
  }
  return 0;
}

当是n个元素时,最坏的情况找了n次,效率低。而当我们折半查找效率就提高了很多。

二分查找

#include<stdio.h>
int main()
{
  int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  int k = 7;//要查找的数字
  int find = 0;
  int left = 0;
  int right = sizeof(arr)/sizeof(arr[1]) - 1;//元素个数
  int mid = 0;//中间元素的下标
  while (left <= right)
  {
    mid = (right + left) / 2;
    if (arr[mid] < k)
    {
      left = mid + 1;
    }
    else if (arr[mid] > k)
      right = mid - 1;
    else
    {
      find = 1;
      break;
    }
  }
  if (1 == find)
  {
    printf("找到了,下标是%d", mid);
  }
  else
    printf("找不到");
 
  
  return 0;
}

当然遍历数组和二分查找的运行结果是一样的 :

函数实现

 

int bin_search(int arr[], int left, int right, int key)
{
  int mid = 0;
  while(left<=right)
  {
        mid = left+(right-left)/2;
 
    if(arr[mid]>key)
    {
      right = mid-1;
    }
    else if(arr[mid] < key)
    {
      left = mid+1;
    }
    else
      return mid;//找到了,返回下标
  }
  return -1;//找不到
}

欢迎斧正!!!


目录
相关文章
|
3月前
|
机器学习/深度学习 算法 测试技术
【组合数学 容斥原理 逆向思考】2930. 重新排列后包含指定子字符串的字符串数目
【组合数学 容斥原理 逆向思考】2930. 重新排列后包含指定子字符串的字符串数目
|
2月前
|
算法 C语言
详解用二分法查找有序数据中的指定数字
详解用二分法查找有序数据中的指定数字
13 1
|
2月前
|
存储 人工智能 BI
小苯的九宫格,小苯的好数组(排序),小苯的数字合并(字典树,前缀和)
小苯的九宫格,小苯的好数组(排序),小苯的数字合并(字典树,前缀和)
26 3
|
3月前
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
25 0
|
3月前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
27 0
|
3月前
|
存储 编译器 C语言
Day2 排序子序列、倒置字符串
Day2 排序子序列、倒置字符串
40 0
|
10月前
【Leetcode -205.同构字符串 -228.汇总区间】
【Leetcode -205.同构字符串 -228.汇总区间】
23 0
|
12月前
从排列字符串到排列序列:解析增减字符串匹配问题
题目要求根据给定的字符串 s,构造一个排列序列 perm,其中排列序列中的数字满足以下规则: 如果 perm[i] < perm[i + 1],则对应的字符为 'I'; 如果 perm[i] > perm[i + 1],则对应的字符为 'D'。 我们需要根据字符串 s 中的字符,构造满足上述规则的排列序列 perm。
47 0
【LeetCode】替换空格&&消失的数字&&分割链表&&除自身以外数组的乘积
【LeetCode】替换空格&&消失的数字&&分割链表&&除自身以外数组的乘积
【LeetCode】替换空格&&消失的数字&&分割链表&&除自身以外数组的乘积
【每日一题Day70】LC1750删除字符串两端相同字符后的最短长度 | 双指针模拟+贪心
思路:使用双指针定位左右两端的字符,当左右两端的字符相同时,删除所有能够删除的相同字符[有一点贪心],将左指针右移,将右指针左移;当左右两端字符不相同时,不能够进行删除操作,最后返回左右指针中间的字符串长度即可
64 0