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

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

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

       实现思路:定义两个字符数组,将要移动的字符数组元素赋值给另一个数组元素,实现多个字符行两端向中间汇聚。(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;//找不到
}

欢迎斧正!!!


目录
相关文章
|
8月前
|
C语言
字符从两端向中间汇聚——c语言实现
字符从两端向中间汇聚——c语言实现
29 0
|
3天前
|
算法 C语言
详解用二分法查找有序数据中的指定数字
详解用二分法查找有序数据中的指定数字
6 1
|
1月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
14天前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
1月前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
20 0
|
1月前
|
算法 测试技术 C#
【滑动窗口】LeetCode:30串联所有单词的子串
【滑动窗口】LeetCode:30串联所有单词的子串
|
8月前
【Leetcode -205.同构字符串 -228.汇总区间】
【Leetcode -205.同构字符串 -228.汇总区间】
20 0
leetcode-76. 最小覆盖子串(滑动窗口)
时间复杂度:最坏情况下左右指针对 s 的每个元素各遍历一遍,哈希表中对 s 中的每个元素各插入、删除一次,对 t 中的元素各插入一次。每次检查是否可行会遍历整个 t 的哈希表,哈希表的大小与字符集的大小有关,设字符集大小为 CC,则渐进时间复杂度为 O(C⋅∣s∣+∣t∣)。
92 0
leetcode-76. 最小覆盖子串(滑动窗口)
【每日一题Day70】LC1750删除字符串两端相同字符后的最短长度 | 双指针模拟+贪心
思路:使用双指针定位左右两端的字符,当左右两端的字符相同时,删除所有能够删除的相同字符[有一点贪心],将左指针右移,将右指针左移;当左右两端字符不相同时,不能够进行删除操作,最后返回左右指针中间的字符串长度即可
60 0
|
算法 Java 索引
【算法】合并两个有序数组,环形链表,无重复字符的最长子串
合并两个有序数组,环形链表,无重复字符的最长子串
70 0
【算法】合并两个有序数组,环形链表,无重复字符的最长子串