题目一
在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; }
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯