1.在上下文和头文件均正常情况下,以下程序的输出结果是()
int x = 1; do{ printf("%2d\n",x++); }while(x--)
A.1
B.无任何输出
C.2
D.陷入死循环
第一次进入循环,输出 1,然后 x 自增为 2,接着在 while 条件判断中,先使用 x 的值 2 进行判断,条件成立进入下一次循环,输出 2,此时 x 自减为 1,又会进入下一次循环,如此反复,就会形成死循环。
2.下列C程序执行后c输出结果为()(32位)
#include<stdio.h> #include<stdlib.h> void main() { int a = -3; unsigned int b = 2; long c = a + b; printf("%ld\n", c); }
A.-1
B. 4294967295
C.0x7FFFFFFF
D.0xFFFFFFFF
在这个程序中,我们定义了两个变量a和b,分别被初始化为-3和2。然后,我们将这两个变量相加,并将结果存储在变量c中。由于a是一个有符号整数,而b是一个无符号整数,所以在进行加法运算时,a会被转换为无符号整数。在32位系统中,-3的二进制表示为11111111111111111111111111111101,将其转换为无符号整数后为4294967293。然后,我们将4294967293和2相加,得到4294967295,将其存储在变量c中。最后,我们使用printf函数将c的值打印出来。由于c是一个长整型变量,所以我们使用%ld作为格式说明符。因此,程序的输出结果为-1。
3.给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
。示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解题思路:
1. 从后往前遍历数组,将nums1和nums2中的元素逐个比较
将较大的元素往nums1末尾进行搬移
2. 第一步结束后,nums2中可能会有数据没有搬移完,将nums2中剩余的元素逐个搬移到nums1
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { int l1=m-1; int l2=n-1; int l3=(m+n)-1; while(l1>=0&&l2>=0) { if(nums1[l1]>nums2[l2]) nums1[l3--]=nums1[l1--]; else nums1[l3--]=nums2[l2--]; } while(l1>=0) nums1[l3--]=nums1[l1--]; while(l2>=0) nums1[l3--]=nums2[l2--]; }