结构体作业等
这里写目录标题
- 题目一
- 题目二
题目一
在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是( )
struct A
{
int a;
short b;
int c;
char d;
};
struct B
{
int a;
short b;
char c;
int d;
};
这里我们还是可以通过画图的方式来解决
其中结构体a的大小可以这样子来解决 大小是16 结构体b的大小可以参考这个解法
所以说 a的大小是16 b的大小是12
题目二
描述
老师给了小乐乐一个正整数序列,要求小乐乐把这个序列去重后按从小到大排序。但是老师给出的序列太长了,小乐乐没办法耐心的去重并排序,请你帮助他。
输入描述:
第一行包含一个正整数n,表示老师给出的序列有n个数。接下来有n行,每行一个正整数k,为序列中每一个元素的值。(1 ≤ n ≤ 105,1 ≤ k ≤ n)
输出描述:
输出一行,为去重排序后的序列,每个数后面有一个空格。
示例1
输入:
4
2
2
1
1
输出:
1 2
示例2
输入:
5
5
4
3
2
1
输出:
1 2 3 4 5
这一题的难点主要在于如何消除相同的数字 这里我一开始的解法是
将这个数组排序 这样子我们就得到了一个有序数组
例如 1 1 2 2 3 4 5
这种格式
要求我们不输出相同的数 这个时候我们只需要设置一个判断条件
如果前面一个数和后面一个数不同 就输出它
很可惜的是 这样子的时间复杂度超了
代码如下
#include <stdio.h>
int main()
{
int n, k, i, j, tmp;
int count;
int arr[1000000] = { 0 };
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < n; i++)
{
if (arr[i] != arr[i + 1])
{
printf("%d ", arr[i]);
}
}
return 0;
}
之后通过看答案得到了一种很巧妙的排法
那就是这个数字为n 那么就在将数组的第n个数字赋值为它 这样子就能避免重复数字的打印
最后打印的时候不打印0 就能得到一个完美的输出
int main()
{
int i, j,n, tmp;
scanf("%d", &n);
int arr[100000] = { 0 };
for ( i = 0; i < n; i++)
{
scanf("%d", &tmp);
arr[tmp] = tmp;
}
for ( i = 0; i <100000; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
return 0;
}
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯