c语言题目

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.输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入

”They are students.” 和 ”aeiou” ,则删除之后的第一个字符串变成 ”Thy r stdnts.”
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值