(C++) 给出一个整数m,查找m是否存在数组a中,如果存在则删除,否则将m插入,要求仍然有序。最后输出?

如题所述

可以用状态机的思想完成。
代码思路:

题目要求找出a中的一个元素,有则删除,无则插入,其实我们可以在输入数组a的元素的时候就可以进行判断和操作。
C语言版本代码示例:
#include <stdio.h>
int main()
{
int a[100];
int n, m;
scanf("%d %d", &n, &m);
int flag = 0; // flag=0时为初始状态(无任何插入删除操作),flag=1时为删除完毕,flag=2时为插入完毕。
for (int i = 0; i < n; i++)
{
int temp;
scanf("%d", &temp);
if (m > temp) // m在输入的数字的后面,可直接插入
{
a[i] = temp;
}
else if (m == temp) // m等于输入的数字,需要删除,则不进行插入
{
flag = 1;
}
else if (m < temp) // m在输入的数字的前面,需要判断flag
{
if (flag == 0) // 如果之前没有出现过m,即flag状态未发生改变,需要在当前位置进行插入
{
a[i] = m;
a[i + 1] = temp;
flag = 2;
}
else if (flag == 1) // 如果之前出现过m
{
a[i - 1] = temp; // 上一个位置等于temp
}
else if (flag == 2)
{
a[i + 1] = temp;
}
}
}
printf("flag:%d\n", flag);
if (flag == 0) // 即m是大于a中所有元素的
{
a[n++] = m;
}
else if (flag == 1) // 删除了一个元素
{
n -= 1;
}
else if (flag == 2) // 插入了一个元素
{
n += 1;
}
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
C++版本代码示例:
#include <iostream>
int main()
{
int a[100];
int n, m;
std::cin >> n >> m;
int flag = 0; // flag=0时为初始状态(无任何插入删除操作),flag=1时为删除完毕,flag=2时为插
for (int i = 0; i < n; i++)
{
int temp;
std::cin >> temp;
if (m > temp) // m在输入的数字的后面,可直接插入
{
a[i] = temp;
}
else if (m == temp) // m等于输入的数字,需要删除,则不进行插入
{
flag = 1;
}
else if (m < temp) // m在输入的数字的前面,需要判断flag
{
if (flag == 0) // 如果之前没有出现过m,即flag状态未发生改变,需要在当前位置进行插入
{
a[i] = m;
a[i + 1] = temp;
flag = 2;
}
else if (flag == 1) // 如果之前出现过m
{
a[i - 1] = temp;
}
else if (flag == 2) // 上一个位置等于temp
{
a[i + 1] = temp;
}
}
}
if (flag == 0) // 即m是大于a中所有元素的
{
a[n++] = m;
}
else if (flag == 1) // 删除了一个元素
{
n--;
}
else if (flag == 2) // 插入了一个元素
{
n++;
}
for (int i = 0; i < n; i++)
{
std::cout << a[i] << " ";
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考
相似回答