在这次测试中有几点收获:
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;
}