第一题: 逆转链表
题目:
代码:
List Reverse( List L )
{
List x, y;
x = L;
L = NULL;
while (x)
{
y = x;
x = x->Next;
y->Next = L;
L = y;
}
return L;
}
本地实现的代码:
//https://pintia.cn/problem-sets/15/problems/724
//链表倒转
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
// 定义一个结构体
typedef struct student
{
int ID;
struct student *next;
} LinkList;
// 创建首尾节点和普通节点
LinkList *head = NULL, *node = NULL, *end = NULL;
// 创建一个链表,链表节点个数为n
LinkList *create( int n )
{
for (int i = 0; i < n; i++)
{
node = ( LinkList* )malloc( sizeof( LinkList ) );
memset(node,0,sizeof(node));
printf("请输入第%d个人的ID\n", i+1);
scanf("%d",&node->ID);
if (i == 0)
{
head = node;
end = head;
}
end->next = node;
end = node;
}
end->next = NULL;
return head;
}
// 循环遍历然后打印
void put( LinkList *head, int n )
{
LinkList *t = head;
while (1)
{
printf("%d\n", t->ID );
t = t->next;
if ( t->next == NULL )
{
printf("%d\n", t->ID );
break;
}
}
}
// 把链表倒叙
LinkList *reverse( LinkList *head )
{
LinkList *x, *y;
x = head;
head = NULL;
while ( x != NULL )
{
y = x;
x = x->next;
y->next = head;
head = y;
}
return head;
}
// 释放内存
void freeLinkList( LinkList *head )
{
LinkList *freeNode = NULL;
while ( head != NULL)
{
freeNode = head;
head = head->next;
free( freeNode );
}
}
int main()
{
int n;
scanf("%d", &n);
LinkList *head;
head = create(n);
put( head, n );
puts("After reverse:");
head = reverse( head );
put( head, n );
freeLinkList( head );
return 0;
}
思路:
链接
做完系统后的思路: 从第2个节点到最后一个节点, 插入到头节点到之前,实现逆转
第三题: 动态规划 数字金字塔
题目:
代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
int max(int a, int b)
{
if (a > b)
return a;
return b;
}
int main()
{
int n;
scanf("%d", &n);
int a[n][n];
memset(a,0,sizeof(a));
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
scanf("%d", &a[i][j]);
}
}
int sum = a[0][0];
int b[n-1][n-1];
memset(b,0,sizeof(b));
b[0][0] = sum;
for (int i = n-2; i >= 0; i--)
{
if (i == n-2)
{
for (int j = 0; j <= i; j++)
{
b[i][j] = a[i][j] + max(a[i+1][j+1], a[i+1][j]);
}
}
else
{
for (int j = 0; j <= i; j++)
{
b[i][j] = a[i][j] + max(b[i+1][j+1], b[i+1][j]);
}
}
}
printf("%d", b[0][0]);
}
思路:
第四题: 珠心算
题目:
代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n;
scanf("%d", &n);
int b[1000];
memset(b,-99,sizeof(b));
int a[n];
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int cnt = 0;
int m = 0;
for (int i = 0; i < n-1; i++)
{
for (int j = i+1; j < n; j++)
{
for (int k = 0; k < n; k++)
{
if (a[k] == a[i] + a[j])
{
int flag = 1;
for (int n = 0; n <= m; n++)
{
if (a[k] == b[n])
{
flag = 0;
break;
}
}
if (flag)
{
cnt++;
b[m++] = a[k];
break;
}
}
}
}
}
printf("%d", cnt);
return 0;
}
思路:
算出两个不同的数组元素的和, 然后判断和是不是在数组内, 在的话再判断这个和是不是已经出现过, 没出现则计数器+1