IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言——一维数组算法问题 -> 正文阅读

[数据结构与算法]C语言——一维数组算法问题

问题1:将数组中的数逆序存放

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按顺序输出数组中的元素。

算法描述:1.向数组a中输入元素;

? ? ? ? ? ? ? ??2.定义一个新数组new,将数组a中的元素倒序存放;

? ? ? ? ? ? ? ??3.将数组b正序输出,注意结尾无空格的格式问题。

代码实现 :?

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i,arr[n];
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }
    
    int new[n],j;					//定义一个数组new用来存入数组a的逆顺序
    for(int j = 0;j < n;j++)
    {
        new[j] = arr[n-1-i];		//倒序存入
    }
    for(int k = 0;k < n - 1;k++)	//数组中最后一个元素不一起输入,保持结尾无空格
    {
        printf("%d ",new[k]);		
    }
    	printf("%d",new[n-1]);		//输出最后一个元素
    return 0;
}

运行结果:


?

?

问题2:求数组中最大值及其下标

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。 输入格式: 输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。 输出格式: 在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

算法描述:1.向数组中存放元素;

??????????????????2.把数组中第一个元素先定义一个变量保存住;

? ? ? ? ? ? ? ? ? 3.遍历数组,如果比保存第一个元素的变量大,那就赋值给那个变量,

?????????????????????直到变量值变为最大;

??????????????????4.定义一个变量用来记录最大值的下标。

代码实现:

#include <stdio.h>
int main()
{
 ? ?int n;
 ? ?scanf("%d",&n);
 ? ?int arr[n],i;
 ? ?for(i = 0;i < n;i++)
 ?  {
 ? ? ? ?scanf("%d",&arr[i]);
 ?  }
 ? ?
 ? ?int max = arr[0];               //定义一个变量保存数组第一个元素
 ? ?for(int j = 1;j < n;j++)
 ?  {
 ? ? ? ?if(max < arr[j])            //如果小于就一直给m,直到找到最大值停
 ? ? ?  {
 ? ? ? ? ? ?max = arr[j];       
 ? ? ?  }
 ? ? }
 ? ?for(int num = 0;num < n;num++)  //记录最大值下标操作
 ?  {
 ? ? ? ?if(arr[num] == max)
 ? ? ?  {
 ? ? ? ? ? ?printf("最大值为:%d\n其下标为:%d",max,num);
 ? ? ? ? ? ?break;
 ? ? ?  }
 ?  }
 ? ?return 0;
}

运行结果:

?

问题3:找出不是两个数组的共有元素

本题要求给定两个整型数组,本题要求找出不是两者共有的元素。

算法描述:1.分别定义两数组并输入值;

??????????????????2.用数组a中元素对比数组b中元素,非共有值放入c中(此处可以用一个? ? ? ? ? ? ? ? ? ? ? ? ? ? ?标志变量flag,标志 是否有共有值);

??????????????????3.用数组b中元素对比数组a中元素,重复“2”操作;

??????????????????4.最后先输出数组c中第一个元素,然后判断元素是否与之前录入元素

? ? ? ? ? ? ? ? ? ? 重复。

??????????????????5.最后打印出来数组c中的元素,也就是非共有值,此处注意格式问题。

代码实现:

#include <stdio.h>
int main()
{
    int n;                      
    scanf("%d",&n);
    int arr1[n],i;                      //定义第一个数组
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr1[i]);
    }
    
    int m;
    scanf("%d",&m);
    int arr2[m],j;                      //定义第二个数组
    for(j = 0;j < m;j++)
    {
        scanf("%d",&arr2[j]);
    }
    
    int k,rem[20] = {};                 //数组rem是用来记录非公有值的
    for(i = 0;i < n;i++)
    {
        int flag = 0;                   //定义标志变量用来标志是否有非共有值
        for(j = 0;j < m;j++)        
        {
            if(arr1[i] == arr2[j])  //用数组1中元素对比数组2中元素,非共有值放入数组rem中
            {
                flag = 1;
            }
        }
        if(flag == 0)
        {
            rem[k] = arr1[i];
            k++;
        }
    }
    
    for(i = 0;i < m;i++)        //用数组2中元素对比数组1中元素,非共有值放入数组rem中
    {
        int flag = 0;
        for(j = 0;j < n;j++)
        {
            if(arr2[i] == arr1[j])
            {
                flag = 1;
            }
        }
        if(flag == 0)
        {
            rem[k] = arr2[i];
            k++;
        }
    }
    
    printf("非共有元素:%d",rem[0]);      //输出rem中第一个元素
    for(i = 1;i < k;i++)
    {
        for(j = 0;j < i;j++)
        {
            if(rem[i] == rem[j])
            {
                break;
            }
        }
        if(j >= i)
        {
            printf(" %d",rem[i]);   //因为提前输出第一个元素,所以后面要打一个空格再打元素,                                                                                         
                                    //结尾无空格的格式问题
        }
    }
    return 0;
}

运行结果:

?

问题4:找出出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的

算法描述:1.定义两个数组,一个用来存放元素,另一个用来当计数器,此数组注意需? ? ? ? ? ? ? ? ? ? ? ?要初始化;

??????????????????2.在这个数组中找到重复的,然后把计数器数组赋值+1;

? ? ? ? ? ? ? ? ? 3.一直遍历找到重复最多的,找到后把计数器数组元素赋值给变量max(也? ? ? ? ? ? ? ? ? ? ? ?就是出现次 数),计数器数组下标就是出现次数最多数的下标。

代码实现:

#include <stdio.h>
int main()
{
 ? ?int n,arr[1000],cnt[1000] = {0};        //cnt为计数器数组,需要初始化
 ? ?int i,j,k,max = 0;
 ? ?scanf("%d",&n);
 ? ?for(i = 0;i < n;i++)
 ?  {
 ? ? ? ?scanf("%d",&arr[i]);
 ?  }
 ? ?
 ? ?for(i = 0;i < n;i++)
 ?  {
 ? ? ? ?for(j = 0;j < n;j++)
 ? ? ?  {
 ? ? ? ? ? ?if(arr[i] == arr[j])        //找到一样的
 ? ? ? ? ?  {
 ? ? ? ? ? ? ? ?cnt[i] = cnt[i] + 1;    //cnt[i]++
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
 ? ?
 ? ?for(i = 0;i < n;i++)
 ?  {
 ? ? ? ?if(max < cnt[i])            //一直遍历直到找重复最多的
 ? ? ?  {
 ? ? ? ? ? ?max = cnt[i];           //找到后赋值给max
 ? ? ? ? ? ?k = i;              //i就是重复最多的数的下标
 ? ? ?  }
 ?  }
 ? ?
 ? ?printf("出现次数最多的数字为:%d\n其出现次数为:%d",arr[k],max);  
 ? ?
 ? ?return 0;
}

运行结果:

?

问题5:数组中插入数字并排序

本题要求给出n个元素的数组,从小到大排列,再输入一个num,插入到数组中, 使得新数组依旧是从小到大的顺序(用一个数组完成)。

算法描述:1.定义一个数组并存放元素,单独记录好倒数第二个元素;

??????????????????2.输入要插入的数字,注意可以考虑特殊情况,如果插入的数大于原本倒数? ? ? ? ? ? ? ? ? ? ? ?第二个数,就可以 直接插入赋值为最后一个元素;

??????????????????3.再来考虑一般情况,遍历数组,如果原本的数大于要插入的数,先保存住? ? ? ? ? ? ? ? ? ? ? ?原来的数字,然 后把插入的数放入到原来的数的位置;

??????????????????4.插入之后,原本的数就到了后一位,需要把后一位的位置保存住,把原本? ? ? ? ? ? ? ? ? ? ? ?的数放到后一 位,再把位置赋上原本数的值;

?????????????????5.最后遍历输出数组元素 。

代码实现 :

#include <stdio.h>
int main()
{
 ? ?int n,i,j;
 ? ?scanf("%d",&n);
 ? ?int arr[n],t1,t2,num,end;
 ? ?for(i = 0;i < n;i++)
 ?  {
 ? ? ? ?scanf("%d",&arr[i]);
 ?  }
 ? ?scanf("%d",&num);           //输入要插入的数字
 ? ?end = arr[n-1];             //保存倒数第二个元素
 ? ?
 ? ?if(num > end)               //考虑特殊情况,如果插入的数大于倒数第二个 
 ?  {
 ? ? ? ?arr[n] = num;           //直接插入赋值
 ?  }
 ? ?else
 ?  {
 ? ? ? ?for(i = 0;i < n;i++)
 ? ? ?  {
 ? ? ? ? ? ?if(arr[i] > num)    //如果原本的数大于插入的数
 ? ? ? ? ?  {
 ? ? ? ? ? ? ? ?t1 = arr[i];    //先保存原来的数
 ? ? ? ? ? ? ? ?arr[i] = num;   //把插入的数放到原来数的位置
 ? ? ? ? ? ? ? ?for(j = i + 1;j <= n;j++)       //处理原来的数
 ? ? ? ? ? ? ?  {
 ? ? ? ? ? ? ? ? ? ?t2 = arr[j];            //原来的数到了后一位保存住
 ? ? ? ? ? ? ? ? ? ?arr[j] = t1;            //把原来的数赋值给现在要存的这个位置上
 ? ? ? ? ? ? ? ? ? ?t1 = t2;
 ? ? ? ? ? ? ?  }
 ? ? ? ? ? ? ? ?break;
 ? ? ? ? ?  }
 ? ? ?  }
 ?  }
 ? ?for(i = 0;i <= n;i++)               //注意这里i<=n,因为多插入了一个数字
 ?  {
 ? ? ? ?printf("%d ",arr[i]);
 ?  }
 ? ?return 0;
}

运行结果:

?

?

问题6:数组循环右移问题

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1?*AN?1)变换为(AN?M?AN?1A0A1?AN?M?1)(最后M个数循环移至最前面的M*个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格

输入样例:

6 2 1 2 3 4 5 6

结尾无空行

输出样例:

5 6 1 2 3 4

结尾无空行

算法描述:1.定义数组并存入元素,输入要移动的值;

??????????????????2.注意先处理一下移动的值,让他和数组中元素的总个数取个余;

??????????????????3.优先考虑特殊情况:如果移动的值为0,那直接打印;

? ? ? ? ? ? ? ? ? 4.移动k个,先把最后k个值放到前面,做特殊处理,方便剩余的元素打印;

? ? ? ? ? ? ? ? ? 5.然后再注意格式问题,打印出除最后一个以外的数字+空格,最后在打印? ? ? ? ? ? ? ? ? ? ? ?最后一个数。

代码实现:

#include <stdio.h>
int main()
{
    int n,move;
    scanf("%d %d",&n,&move);
    int arr[n],i;
    for(i = 0;i < n;i++)
    {
        scanf("%d",&arr[i]);
    }
    
    move %= n;              //取余算出到底移动多少,进行简化
    
    if(move == 0)               //特殊情况特殊处理
    {
        for(i = 0;i < n - 1;i++)
        {
            printf("%d",arr[i]);        //注意格式问题
        }
        printf("%d",arr[n-1]);
        
        return 0;
    }
 ? ?
 ? ?for(i = n - move;i < n;i++)     //移动move,把最后move个数放前面
 ?  {
 ? ? ? ?printf("%d ",arr[i]);
 ?  }
 ? ?for(i = 0;i < n - move - 1;i++) //把剩下除了最后一个数,打印出来
 ?  {
 ? ? ? ?printf("%d ",arr[i]);
 ?  }
 ? ?printf("%d",arr[n-1-move]);         //最后一个没空格
 ? ?
 ? ?return 0;
}

运行结果:

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 19:05:28  更:2021-11-16 19:05:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:43:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码