1.求以下代码的结果
#include <stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int* p1 = (int*)(&a + 1);
int* p2 = (int*)((int)a + 1);
int* p3 = (int*)(a + 1);
printf("%d, %x, %d\n", p1[-1], p2[0], p3[1]);
return 0;
}
分析:在vs-2019中,数组的储存情况是
int* p1 = (int*)(&a + 1);直接&数组名,得到的是一个数组的地址,&a的类型是int(*)[5],&a+1跨过的是一个数组,得到的是数组末端的地址。(int *)强制转换为指针类型。p1[-1]得到的就是p1前一个地址所对应的值5。
int* p2 = (int*)((int)a + 1);这里的数组名对应的类型是int *,表示首元素的地址,(int )将a的地址16进制0x00FF74C转化为10进制5240652,加1得到5240653,(int *)将5240653转化为指针类型,得到的16进制数字是p2所对应的地址004FF74D,其数据以16进制存放是0x 02000000。
int* p3 = (int*)(a + 1);p3对应a【1】的地址,p3[1]就是a【2】的值3
结果:5, 2000000, 3
2.如下代码输出结果是什么?
#include<stdio.h> char buffer[6] = {0}; char *mystring(){ char *s = "Hello world"; for(int i = 0;i<(sizeof(buffer) - 1);i++){ buffer[i] = *(s+i); } return buffer; } int main(int args,char**argv){ printf("%s\n",mystring()); return 0; }
解析:局部变量的作用域在作用的代码块范围之内,随着函数结束,数组内容被回收,我们得到了一个野指针,其内容不确定。
3.要求写一个函数,将字符串中的空格替换为%20。样例: “abc defgx yz” 转换“abc%20defgx%20yz”
#include<stdio.h>
#include<string.h>
void fun(char* p, int n)
{
int count = 0;
for (int i = 0; i < n; i++)
{
if (*(p + i) == ' ')
count++;
}
int j = count * 2 + n - 1;//扩大数组长度 从后便利,避免元素被重新覆盖
for (int i = n - 1; i >= 0; i--)
{
if (*(p + i) == ' ')
{
p[j--] = '0';
p[j--] = '2';
p[j--] = '%';
}
else
p[j--] = p[i];
}
}
int main()
{
char arr[20] = { 0 };
printf("输入字符串内容\n");
gets(arr);
int sz = strlen(arr);
fun(arr, sz);
puts(arr);
return 0;
}
4.求 unsigned int 型变量 x 在内存中二进制 1 的个数
//运用&运算:同时为1则为1
#include<stdio.h>
int main()
{
unsigned int x;
int count = 0;
scanf("%d", &x);
while (x)
{
x = x & (x - 1);
count++;
}
printf("%d", count);
}
5.有一个数组 , 编写函数,求数组中前K个最小的数字
int Fun(int* p,int n)
{
int k = 0;
printf("请输入数字k,来查找数组前k个元素中最小的数字,k的范围1~%d\n",n);
scanf("%d", &k);
int min = p[0];
for (int j = 0; j < k; j++)
{
if (*(p + j) < min)
min = *(p + j);
}
return min;
}
int main()
{
int arr[100] = { 0 }; int i = 0;
printf("请输入数组的数字\n");
char ch = 0;
while (ch!='\n')
{
scanf("%d", &arr[i]);
ch=getchar();
i++;
}
i = Fun(arr, i);
printf("数组前k个元素最小的数字是%d", i);
return 0;
}
6.输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的 最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输 出为该子数组的和18
- 比如:-1+3,在加3之前已经为负数了,和肯定不是最大的,那么如果在加数字之前,之前和已经是负数了,将其舍弃(设置0)重新开始查找最大连续和
- 4,-1,5,-9;4-1=3,记录这个和,3+5=8,和之前的和比较,8最大,记录这个和,8-9=-1,和之前的和8比较,8最大。因为求连续子树和,所以结果就是8
class Solution {
public int maxSubArray(int[] nums) {
int i=0,sum=0,max=nums[0];
//有一种情况,例如:-1,-3,-4这样的序列,如果max为0,max永远都是0,那么结果返回0,error
for(i=0;i<nums.length;i++){
if(sum<0)
sum=0;
sum+=nums[i];
max=max>sum?max:sum;
}
return max;
}
}
7.在字符串中找出第一个只出现一次的字符。如输入 "abaccdeff" ,则输出 'b' 。
#include<stdio.h>
#include<string.h>
int search(char* p, int n)
{
if (n == 1)
return p[0];
char count[256] = { 0 };
for (int i = 0; i < n; i++)
count[p[i]]++;//p[i]里面存放字符转换为了对应的ascii码值
for (int i = 0; i < n; i++)
if (count[p[i]]== 1)
{
return *(p+i);
break;
}
return '0';
}
int main()
{
char arr[100] = { 0 }; char ch = 0; int i = 0;
printf("请输入字符串\n");
gets(arr);
i = strlen(arr);
ch = search(arr, i);
if (ch != '0') printf("%c ", ch);
else printf("没有只出现重复的字符\n");
return 0;
}
8.输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入
#include<stdio.h>
#include<string.h>
void Delate(char* arr, char* str,int m,int n)
{
int j = 0;
for (int i =0;i<m; i++)
{
int flag = 1;
for (int k = 0; k < n; k++)
{
if (arr[i] == str[k])
{
flag = 0;
break;
}
}
if (flag == 1)//没有相等的
arr[j++] = arr[i];
}
arr[j] = '\0';
}
int main()
{
char arr[100] = { 0 };
char str[100] = { 0 };
printf("输入第一个字符串\n");
gets(arr);
int m = strlen(arr);
printf("输入第二个字符串\n");
gets(str);
int n = strlen(str);
Delate(arr, str, m, n);
puts(arr);
return 0;
}
9.字符串压缩. 输入字符串只包含 a-z 字母以及结束标志,请编写函数实现对连续出现的相同字符进行压缩,例 如: ”xxxyyyyz” 压缩后字符串为 ”3x4yz” , ”yyyyyyy” 压缩后为 ”7y”
#include<stdio.h>
#include<string.h>
void Fun(char* p, int n)
{
int count = 0;//;
int sz = n;
int k = 0;
for (int i = 0; i < n; i++)
{
if (p[i] == p[i + 1])
count++;
else if (count)
{
p[k++] = count + '1';
p[k++] = p[i];
count = 0;
}
else
p[k++] = p[i];
}
p[k] = '\0';
}
int main()
{
char arr[100] = { 0 };
printf("输入数组内容\n");
gets(arr);
int sz = strlen(arr);
Fun(arr, sz);
puts(arr);
return 0;
}