首页 > 其他分享 >C:每日一题:双指针法的使用

C:每日一题:双指针法的使用

时间:2024-08-22 23:28:02浏览次数:11  
标签:arr right int 每日 数组 使用 指针 left

前言:

思虑再三,觉得如果有时间每日一题还是可以更新一下的。

题目难度:基础

解题方法:双指针法

一、题目

输入一个整数数组,

实现一个函数来调整该数组中数字的顺序使得

数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

二、题目分析

本题目标:

将给定的整数数组中的奇数和偶数分开,使得奇数在前半部分,偶数在后半部分,同时保持奇数和偶数各自的相对顺序不变。

算法选择:双指针法

选择双指针法是因为它只需要对数组遍历一次即可。时间复杂度较低。

设置两个指针 left 和 right 分别指向数组的头部和尾部。

循环选择:while循环

循环条件是 left < right,这是为了确保两个指针相遇前能够持续进行调整

指针移动的条件及逻辑(奇数在偶数左边)

当left指针指向的数是奇数时,说明当前数字所在位置正确,无需调整,直接移动到下一位(后一位)

当right指针指向的数时偶数时,说明当前数字所在位置正确,无需调整,直接移动到上一位(前一位)

数字交换及位置调整

left指向偶数且right指向奇数时,说明这两个数字的位置需要交换。通过交换这两个数字,将奇数移动到数组的前半部分,偶数移动到数组的后半部分。

交换后,left指针后移一位,right 指针前移一位,继续进行下一轮的调整。

三、代码展示:

#include <stdio.h>

void sort(int arr[], int sz)
{
    int left = 0;  // 指向数组头部的指针
    int right = sz - 1;  // 指向数组尾部的指针
    while (left < right)
    {
        if (arr[left] % 2 == 1)
        {
            left++;  // 如果 left 指向奇数,left 指针后移,因为奇数应在数组前半部分
        }
        else if (arr[right] % 2 == 0)
        {
            right--;  // 如果 right 指向偶数,right 指针前移,因为偶数应在数组后半部分
        }
        else
        {
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;  // 交换后 left 指针后移
            right--;  // 交换后 right 指针前移
        }
    }
}

int main()
{
    int arr[10] = { 0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < sz; i++)
    {
        scanf("%d", &arr[i]);  // 输入数组元素
    }
    sort(arr, sz);  // 调用函数实现奇数在前、偶数在后的调换
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);  // 输出调整后的数组
    }
    return 0;
}

 

结语:

今天这道题比较简单,我写这道题主要也就是想介绍一个双指针法的使用,还望理解!

后面有时间小编会更新一篇文章来详细介绍一下双指针法,敬请期待!

标签:arr,right,int,每日,数组,使用,指针,left
From: https://blog.csdn.net/2401_85010100/article/details/141360172

相关文章

  • 045、Vue3+TypeScript基础,pinia库中使用$subscribe订阅数据变动
    01、main.js代码如下://引入createApp用于创建Vue实例import{createApp}from'vue'//引入App.vue根组件importAppfrom'./App.vue'//第一步:引入piniaimport{createPinia}from'pinia'constapp=createApp(App);//第二步:创建pinia实例constpinia=......
  • 声音克隆GPT-SoVITS 2.0软件和详细的使用教程!
    天命人,请允许我先蹭个热点!  原始声音:播放克隆声音:播放 文章写了一半,被《黑神话悟空》刷屏了。突发奇想,用里面的声音来做个素材试试看。B站捞了一点声音素材,随便剪一剪,训练一把过,没有调优,就直接拿来用了。情绪还差点意思,音色克隆的还不错。......
  • 织梦dedecms使用sql语句获取文章链接地址
    在织梦DeDeCMS中,可以通过SQL语句结合织梦特有的标签来获取文章链接地址。以下是如何使用SQL语句获取文章链接地址的具体步骤和示例。1.SQL语句织梦CMS允许在模板中使用自定义SQL语句来获取数据。这可以通过 {dede:sql} 标签来实现。2.获取文章链接地址SQL语句:编写SQL语句......
  • 【人工智能】案例分析和项目实践:使用高斯过程回归预测股票价格
    一、项目背景与目标股票价格预测是金融领域的热门话题,对于投资者、金融机构及研究者而言具有重要意义。高斯过程回归(GaussianProcessRegression,GPR)作为一种强大的非参数贝叶斯回归方法,能够处理复杂的非线性关系,同时提供预测的不确定性估计,非常适合用于股票价格预测。项目......
  • 使用pkg将node项目打包成exe
    PS:教程仅限于windows系统,其他操作系统请自行百度。1、node版本(我用的这两个版本都没问题):node:v14.18.1、v14.18.22、安装pkg(推荐使用v5.7.0):[email protected]、创建pkg_test文件夹,并初始化一个node项目:mkdirpkg_testcdpkg_testnpminit-y4、创建一个i......
  • C/C++语言基础--指针三大专题详解3,完结篇(包括指针做函数参数,函数指针,回调函数,左右法
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言指针是C/C++的灵魂,和内存地址相关联,运行的时候速度快,但是同时也有很多细节和规范要注意的,毕竟内存泄漏是很恐怖的指针打算分三篇文章进行讲解,本专题是三,完结篇,介绍了指针做函数参数,函数指针,回调函数,左右法则解决复......
  • Latex引用两个文献——使用连字符
    Latex引用两个文献——使用连字符问题描述解决办法问题描述在一些国内期刊正文中引用参考文献时,如果是2个或者2个以上的连续数字时应该用连字符连起来,例如:“[1,3]”,“[4-5]”,但是使用常见的方法(\usepackage[numbers,sort&compress]{natbib})并不会对2个文献引用起作用......
  • Java基础——自学习使用(static关键字)
    一、static关键字是什么?static修饰的代码属于类,定义的变量存储在方法区的静态常量池当中二、static可以修饰什么1.static修饰变量static修饰的变量叫做类变量,被所有该类产生的对象所共享,存储在方法区的静态常量池中2.static修饰方法static修饰是的方法属于静态方法,stat......
  • 使用Jaspyt对配置文件密码保护
    1、添加依赖<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency>......
  • 使用uvm_config_db 分层Testbench配置
    前言 对于刚接触验证方法或正在采用uvm的工程师,本文重点介绍uvm配置机制"uvm_config_db",它有助于在分层测试台组件之间传递不同的类属性。通过使用示例,本文解释了uvm_config_db的用法、技术和局限性。介绍 为满足当今验证架构的需求,有必要对组件进行分层设置,以便在不......