二级C语言题解:孤独数、找最长子串、返回两数组交集

目录

[一、程序填空 --- 孤独数](#一、程序填空 --- 孤独数)

题目

分析

[二、程序修改 --- 找最长子串](#二、程序修改 --- 找最长子串)

题目

分析

[三、程序设计题 --- 返回两数组交集](#三、程序设计题 --- 返回两数组交集)

题目

分析


前言:

本文开始讲解二级C语言的程序填空题和程序改错题以及程序设计题

旨在帮助大家更好的理解这些题目

希望能够帮助到大家(* ̄︶ ̄)

本系列专栏:二级C语言题解

一、程序填空 --- 孤独数

题目

在整数数组中,如果一个数的出现次数最少,我们就称这个数为"孤独数"。

给定一个整数数组,输出其中最小的孤独数。

函数fun的功能是求出长度为n的数组a中的孤独数并返回(n最大不会超过100)

例如:当n为6,a数组为5.3.3.3.2.2时,的数返回值应为5。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:不得增行或删行,也不得更改程序的结构

代码如下:

在1️⃣2️⃣3️⃣处填空

cpp 复制代码
#include  <stdio.h>
#define  N   100
int fun(int a[ ], int n)
{   int b[N], c[N]={0};
    int cc = 0;
	int i, j, min;
    for(i=0; 1️⃣ ; i++)
/******************found*******************/
    {   for(j=0; j < cc; j++) 
           if (a[i] == b[j])
				break;
/******************found*******************/
	    if ( 2️⃣ )
		{	b[cc] = a[i];
			c[cc] = 1;
		    cc++;
		}
		else
			c[j]++;
	}
	min = 0;
	for(i=1; i<cc; i++)
	    if (c[i] < c[min])
			min = i;
/******************found*******************/
	return   3️⃣;
}
main( )
{   int a[N] ={5, 3, 3, 3, 2, 2};
	int min_lone;
	min_lone = fun(a, 6);
	PDF("min_lone=%d\n", min_lone);
}

分析

根据题意,找孤独数,也就是数组中出现次数最少的数字

在题目中给出了数组a,b,c

b数组保存原数组a中唯一的数字

c数组与b数组配合使用,c数组的每个元素保存的是b数组中的数字出现的个数

关系如下:

解题代码如下:

cpp 复制代码
#include  <stdio.h>
#define  N   100
int fun(int a[ ], int n)
{   int b[N], c[N]={0};
    int cc = 0;
	int i, j, min;
    for(i=0; i<n; i++)
/******************found*******************/
//因为cc是数组b和c的下标位置
//所以这里j < cc的意思是,从0遍历到cc-1的位置
   {  for(j=0;1️⃣ j < cc; j++)
           if (a[i] == b[j])
				break;
/******************found*******************/
        //这个是和最近的这个for循环对应的
        //当数组a中有和数组b不一样的元素时,就添加
        //那有不一样的元素的条件是什么?就是当j>=cc的时候
        //也就是上方循环不是通过break结束的时候(没有相等的元素)
	    if (2️⃣ j >= cc)
		{	b[cc] = a[i];
			c[cc] = 1;
		    cc++;
		}
		else
			c[j]++;
	}
    //因为c数组保存的是b数组中的元素
    //在原数组a中出现的次数
    //当次数最少时,就是孤独数
	min = 0;
	for(i=1; i<cc; i++)
	    if (c[i] < c[min])
			min = i;
/******************found*******************/
    //最后是返回b数组中的元素最小的值
	return   3️⃣b[min];
}
main( )
{   int a[N] ={5, 3, 3, 3, 2, 2};
	int min_lone;
	min_lone = fun(a, 6);
	printf("min_lone=%d\n", min_lone);
	getchar();
}

二、程序修改 --- 找最长子串

题目

函数fn的功能是从字符串s(长度不超过100)中找出不含有重复字符的最长子串放t中。

若有多个相同长度的不含有重复字符的最长子串,则从左至右取第一个作为最后结果放入t中。

例如:s为"abcabcbb"时,t应为abc'.

例如:s为"abbccabbccbb"时,t为"cab"

例如:s为"bbbbb"时,t应为"b"

例如:s为"pwwkew"时,t应为wke'正确的结果。

请改正程序中的错误,使它能得出行或删行,也不得更改程序的结构!注意:不要改动main函数

代码如下:

在代码中找出错误并修改

cpp 复制代码
#include  <stdio.h>
#include  <string.h>
#define  N   100

void fun(char s[], char t[])
{
    int max_len, len, max_pos, pos, i,j,k;
    max_len = 1;
    max_pos = 0;
	for (i=0; i<strlen(s); i++)
	{
		pos = i;
	/**********************found***********************/
	len = 0;
		for (j=pos+1; j<strlen(s); j++)
		{
			for(k=pos; k<j; k++)
			   if (s[j]==s[k])
			  	  break;
/**********************found***********************/
			if (k<j)
			  len++;
			else
			  break;
		}
/**********************found***********************/
		if (len<max_len)
		{
			max_len = len;
			max_pos = pos;
		}
	}
	for (i=max_pos; i<max_pos+max_len; i++)
		t[i-max_pos] = s[i];
	t[max_len]='\0';
}
main( )
{
    char *str1="abcabcbb", *str2="abbccabbccbb", *str3="bbbbb", *str4="pwwkew",res[N];
	fun(str1,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str1, res);
	fun(str2,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str2, res);
	fun(str3,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str3, res);
	fun(str4,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str4, res);
}

分析

要从一个字符串中找到一个最大的不重复子串,就可以用依次比较法

首先假设有三个指针 i, j, k(以题目的变量为例)

i 全局控制循环次数,也就是从第一个字符一直到最后一个

j 始终在 k 的后面

k是指向i的位置,一直比到k的位置,看是否相等

如果一直到循环结束 s[j]==s[k] 都不相等则长度len加一

如果 s[j]==s[k] 相等则打断

关系图

cpp 复制代码
#include  <stdio.h>
#include  <string.h>
#define  N   100

void fun(char s[], char t[])
{
    int max_len, len, max_pos, pos, i,j,k;
    max_len = 1;
    max_pos = 0;
    
    // i 是对s字符串的
	for (i=0; i<strlen(s); i++)
	{
		pos = i;
	/**********************found***********************/
        //因为没有重复的最小子串的长度就为1
        //所以要先设定为1
		1️⃣len = 1;
		for (j = pos+1; j < strlen(s); j++)
		{
			for(k = pos; k < j; k++)
			   if (s[j] == s[k])
			  	  break;
/**********************found***********************/
            //当上方的循环不是通过break退出的
            //则表示没有相等的,因此长度len加1
			if ( 2️⃣k >= j )
			  len++;
			else
			  break;
		}
/**********************found***********************/

        //当len 大于max_len才有必要交换
		if ( 3️⃣len > max_len )
		{
			max_len = len;
			max_pos = pos;
		}
	}
	for (i=max_pos; i<max_pos+max_len; i++)
		t[i-max_pos] = s[i];
    //因为是字符串,最后一定要加上斜杠零
	t[max_len]='\0';
}
main( )
{
    char *str1="abcabcbb", *str2="abbccabbccbb", *str3="bbbbb", *str4="pwwkew",res[N];
	fun(str1,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str1, res);
	fun(str2,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str2, res);
	fun(str3,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str3, res);
	fun(str4,res);
	printf("字符串 %s 中不含有重复字符的最长子串是: %s\n", str4, res);
	getchar();
}

三、程序设计题 --- 返回两数组交集

题目

请编写一个函数int fiun(int A], int m, int B[], int n, int C[])

使对于从小到大有序数组A和B返回A和B的交集C

假定A与B长度均不超过100,m是A数组元素个数,n是B数组元素个数

可能存在重复元素,因此最终生成交集C要注意去重复

并且保持从小到大有户通过函数值返回交集C中元素个数

例如:

A数组长度为9,元素值为:1,2,2,3,3,3,5,6,7

B数组长度为6,元素值为:2,2,3,6,8时

C数组长度应为3,元素值应为: 2,3.6

代码如下

在fun函数里填写代码

cpp 复制代码
#include<stdio.h>
#define  N   100
int fun(int A[ ], int m, int B[ ], int n, int C[ ])
{
	//在此处填写
}
main( )
{	int a[N]={1,2,2,3,3,3,5,6,7}, b[N]={2,2,3,3,6,8}, c[N];
	int k,i; 
    k = fun(a,9,b,6,c);
	if(k > 0)
	{
		printf("A和B数组交集元素个数:%d\n", k);
        for (i=0; i<k;i++)
			printf("%d ", c[i]);
	}
	else
		printf("A和B数组无交集!\n");
}

分析

因为求两个数的交集,所以可以先让数组A里的每一个元素和B数组中的所有元素相比较

当数组A中的元素与数组B中的元素相同,添加在数组C中

因为要求是交集不能重复,所以要在添加到数组C中之前先和数组C中的每一个元素比较

如果没有相同的则添加

cpp 复制代码
#include<stdio.h>
#define  N   100
int fun(int A[ ], int m, int B[ ], int n, int C[ ])
{
	int i, j, sum = 0, k;
    //每次取A中的i值与B数组中所有值进行比较
	for( i = 0; i < m; i++ )
		for( j = 0; j < n; j++ )
            //如果相同时,则考虑添加
			if( A[i] == B[j] )
            {   //在添加之前
                //看看数组C中是否和A[i]或B[j]有相同的
            	for( k = 0; k < sum; k++ )
				{	if( C[k] == A[i] )
						break;
				}
                //如果程序正常打断
                //则表示没有相同的元素,就添加进C数组中
				if( k >= sum )
					C[sum++] = A[i];
				else break;
			}
	return sum;

}
main( )
{	int a[N]={1,2,2,3,3,3,5,6,7}, b[N]={2,2,3,3,6,8}, c[N];
	int k,i; 
    k = fun(a,9,b,6,c);
	if(k > 0)
	{
		printf("A和B数组交集元素个数:%d\n", k);
        for (i=0; i<k;i++)
			printf("%d ", c[i]);
	}
	else
		printf("A和B数组无交集!\n");
}

如果本文对你有帮助,还望点个赞,收藏一下,关注一波呢(* ̄︶ ̄)

这些将是我前进的动力

万分感谢😊

相关推荐
计算机-秋大田10 分钟前
微信外卖小城程序设计与实现(LW+源码+讲解)
java·开发语言·微信·微信小程序·小程序·课程设计
老大白菜17 分钟前
使用 Go 和 gqlgen 实现 GraphQL API:实战指南
开发语言·golang·graphql
2301_7930698230 分钟前
JAVA 接口、抽象类的关系和用处 详细解析
java·开发语言
YGRHSXZYGR37 分钟前
2025年寒假ACM训练赛1
算法
fancc椰38 分钟前
C++ - AVL平衡二叉树
数据结构·c++·算法
大秦王多鱼1 小时前
【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)
java·开发语言
sjsjs111 小时前
【反悔堆】力扣1642. 可以到达的最远建筑
java·算法·leetcode
小禾苗_1 小时前
数据结构——查找算法和排序算法
数据结构·算法·排序算法
池央1 小时前
C语言字符串详解
c语言
Gu_n_ian_1 小时前
C语言怯魅——指针和数组
c语言·数据结构·算法