目录
[一、程序填空 --- 孤独数](#一、程序填空 --- 孤独数)
[二、程序修改 --- 找最长子串](#二、程序修改 --- 找最长子串)
[三、程序设计题 --- 返回两数组交集](#三、程序设计题 --- 返回两数组交集)
前言:
本文开始讲解二级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");
}
如果本文对你有帮助,还望点个赞,收藏一下,关注一波呢(* ̄︶ ̄)
这些将是我前进的动力
万分感谢😊