1 时间计算
这题是选自阿里的2018校招编程题,当时在30分钟之内没做出来,有点沮丧,事后查找了一下别人写的代码,感觉都不是很好,于是自己写了一个
源码稍后发布
#include"stdio.h"
int a[6] = { 0,0,5,6,0,6 };
//排序的数组 排序的位数 排序的类型(true 升序/ false 降序)
int sort(int *a,int num,bool type) {
for (int i = 0; i<num-1; i++) {
for (int j = i + 1; j<num; j++) {
if ((type&&a[i] > a[j]) || (!type&&a[i] < a[j])) {
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[j] ^ a[i];
}
}
}
return 1;
}
int isInData(int i){
int b[6]={0},n=5;
while(i){
b[n--]=i%10;
i/=10;
}
sort(b,6,true);
for(int i=0;i<6;i++){
if(a[i]!=b[i]){
return 0;
}
}
return 1;
}
int main()
{
//因为总是要输入6个数的,所以n无所谓的。。但是在线答估计要加
//int n;
int max=0,min=0,temp[2]={0},j=0;
sort(a, 6, true);
//scanf_s("%d", &n);
//for (int i = 0; i < 6; i++) {
// scanf_s("%d", &a[i]);
//}
for(int i=0;i<6;i++){
min=min*10+a[i];
max=max*10+a[5-i];
}
//规则1 不符合时间规则的统统去掉 可以自己尝试就知道了
if((min>599&&min<1000)||(min>5599&&min<10000)||(min>59999&&min<100000)||(min>235599)){
printf("N/A\n");
return 0;
}
//最浪费时间的地方,但是也不慢多少~
for(int i=min;i<max;i++){
//判断时间格式是否正确
if((i/100000<3)&&(i/10000)%10<4&&(i/1000)%10<6&&(i/10)%10<6){
//判断i中的所有元素是否和a相同
if(isInData(i)){
//printf("%d\t",i);
temp[j]=i;
temp[1]=temp[j];
j=1;
}
}
}
if(temp[1]==temp[0]){
printf("%06d\n",temp[0]);
}
else{
printf("%06d %06d\n",temp[0],temp[1]);
}
return 0;
}
2 A+B+C
很简单:
print(sum([int(n) for n in input().split(' ')]))
3 螺旋矩阵
需要考验逻辑能力,只能根据点的坐标去计算出它的数值,不能通过预先计算好一个螺旋矩阵来计算坐标的值,需要稍稍费些脑筋
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
int n=1;
//计算当前层数外的所有层的点个数
int getCircle(int a){
if(a==0)
return 0;
return (4*n+4-8*a)+getCircle(a-1);
}
int main()
{
//输入
int x,y;
printf("please input your number:\n");
//scanf("%d %d %d",&n,&x,&y);
n=5;
x=3,y=3;
//计算层数,如果n为单数的话,一半=(n+1)/2
int halfN=n%2==0?n/2:((n+1)/2);
int t1=x<halfN?x:n-1-x;
int t2=y<halfN?y:n-1-y;
//层数
int layer=t1<t2?t1:t2;
int num;
if(x==layer){
num=getCircle(layer)+y+1-layer;
}
else if(y==n-1-layer){
num=getCircle(layer)+x+n-3*layer;
}
else if(x==n-1-layer){
num=getCircle(layer+1)-n+2-y+layer*3;
}
else{
num=getCircle(layer+1)-x+1+layer;
}
printf("%d\n",num);
return 0;
}
另外,附带上一份螺旋矩阵的显示:
#include<stdio.h>
#include<stdlib.h>
//N阶螺旋矩阵
int main()
{
int N,i,j,n,num=1;
int **a;
printf("输入你要输出的几阶中断:");
scanf("%d",&N);
a = (int **)malloc(sizeof(int *) * N);//每一行的地址
for(i = 0; i < N; i++)
a[i] = (int *)malloc(sizeof(int) * N);//存放每一行的数字
for(n=0;n<=N/2;n++)
{
for(j=n;j<=N-n-1;j++)
a[n][j]=num++;
for(i=n+1;i<N-n-1;i++)
a[i][N-n-1]=num++;
for(j=N-n-1;j>n;j--)
a[N-n-1][j]=num++;
for(i=N-n-1;i>n;i--)
a[i][n]=num++;
}
//输出螺旋矩阵
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%2d ",a[i][j]);
printf("\n");
}
return 0;
}
网友评论