一次自我测试(限时)-----”越学越菜“

    在这次测试中有几点收获:

1.在一定时间中写出代码和自己慢慢写是两种体验,它对你敲代码的熟练度和知识运用得灵活度提出了更高的要求,我还得更加努力。

2.在与大佬的代码比较后,自愧不如,感觉学的不是一个语言,同一个题竟可以用c语言如此简单,迅捷的表达出来,该说大佬不愧是大佬,自己要学的还有很多,自己应该敲得代码还有更多!!

3.代码不是自己懂就好,还要让别人懂,所以要加上备注,同时它还可以让自己理清思路,所以备注很重要,以后的代码要加上备注!!(和大佬学到了)

**越学越发现自己和大佬的差距越大,感觉自己越来越菜,路还很长吾辈还需努力。

测试题如下:(附代码)

 

1. 逆转整数:Reverse Integer 

Example1: x = 123, return 321
Example2: x = -123, return -321
处理溢出:  比如整数最大值2147483647逆转之后的整数值不存在
要求所有值逆转之后再判断是否溢出

#include<stdio.h>
#include<string.h>
#include<math.h>

int reverse_integer(int n)
{
	long long b = 0;
//int的最值
	int max = 0x7fffffff;
	int min = -max-1;
	int a = 1;
	//判断正负
	if(n<0)
	{
	a = -1;
	}
	//n取绝对值
	n = (n>=0? n: -n);
	//逆转
	b = n%10;
	while(n>=10)
	{
	n = n/10;
b = b*10 + n%10;
	}
b = a*b;
//防止逆转后溢出
	if(b<max && b>min )
	{
		return b;
	}
	return 0;
}

int main()
{
	
	int a = 123;
	int b = -123;
    int a2  = reverse_integer(a);
	int b2 = reverse_integer(b);
	printf("%d %d \n",a2 ,b2);
	system("pause");
return 0;
}


2. 判断一个字符串是否为回文字符串:abcdcba
要求:不能使用额外数组,额外字符串

#include<stdio.h>
#include<string.h>
#include<math.h>


int is_palindrome(char*p)
{
int sz = strlen(p);
char* right = p;
char* left = p+sz-1;
//判断字符串前后对称位置字符是否相等 并向中间逼近
while(right <= left)
{
if(*right == *left)
{
right++;
left--;
}
return 0;//不是回文字符串
}
return 1;//是回文字符串
}

int main()
{
	
	char arr[] = "abcdcba";
	char arr2[] = "abcddba";
	int c = is_palindrome(arr);
	int c2 = is_palindrome(arr2);
	printf(" %d %d\n", c, c2);
	system("pause");
return 0;
}


3. 判断一个数字是否为回文数(负数不是回文数)
要求:不能使用额外数组,不允许计算中出现溢出

#include<stdio.h>
#include<string.h>
#include<math.h>



int is_palindrome_math(int n)
{
	int div = 1;
	//是div与n在同一数量级上
while(n/div >=10)
{
div *= 10;
}
//判断数字是否为回文数
while(n>9)
{
//判断最高位与最低位是否相等
	if(n/div != n%10)
	{
	return 0;
	}
	//掐头去尾
	n %= div;
	n /= 10;
	div /= 100;
}
return 1;
}
 

int main()
{
	int d = 1234321;
	int d2 = 1234567;
	int dy = is_palindrome_math(d);
	int dy2 = is_palindrome_math(d2);
	printf(" %d %d\n", dy, dy2);
	system("pause");
return 0;
}

4. 从0到n之间取出n个数,找出漏掉的那个数,这n个数乱序
要求:不使用额外数组

#include<stdio.h>
#include<string.h>
#include<math.h>

int find(int a[], int n)
{
//0-n为一个数组  取出的数单独为一个数组
	//共2n+1个数  且只有一个数单独出现一次  其他的数都是成对出现
	int i = 0;
	int res = 0;
//异或2n+1个数 结果就是单独的那个数数
	for(i=0; i<=n; i++)
	{
	res ^=i;
	}
	for(i=0; i<n; i++)
	{
	res ^=a[i];
	}
	return res;
}


int main()
{
	char arr[] = "01234567";
	int a = 7;
	int b =  find(arr[], a)	
	printf( "%d \n", d );
	system("pause");
return 0;
}


5. 给出一个整数,判断它是否是2的幂

#include<stdio.h>
#include<string.h>
#include<math.h>

int is_2pow(int n)
{
//如果他是2的幂那么他的二进制表达式就只有一个一,其它位位零
int count = 0;
int i = 0;
//int的二进制有32位 判断每一位是否为1
for(i=0; i<32; i++)
{
if(((n >> 1) & 1) == 1)

{
if(count)
{
return 0;
}
else 
{
	count++;
}
}
}
return count;
}



int main()
{
	int a = 15;
	int b = 16;
    int a2  = is_2pow(a)
	int b2 = is_2pow(b)
		printf("%d %d \n",a2 ,b2);
	system("pause");
return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值