PTA 程序设计题(数据结构第一章)

C语言版

第一题 二分查找

感觉还好

Position BinarySearch(List L, ElementType X)
{
    // 数组大小
    // int N = sizeof(L->Data) / sizeof(*L->Data);
    int start = 1;
    int end = L->Last;
    int mid;
    while (start <= end)
    {
        mid = (start + end) / 2;
        if (L->Data[mid] > X)
            end = mid - 1;
        else if (L->Data[mid] < X)
            start = mid + 1;
        else
            return mid;
    }
    return NotFound;
}

第二题 最大子序列和

方法1

#include<stdio.h>
#include<malloc.h>
int Sum(int A[], int N)
{
 int maxSum, thisSum;
 maxSum = thisSum = 0;
 for (int i = 0; i < N; i++)
 {
 thisSum = 0;
 for (int j = i; j < N; j++)
 {
 for (int k = i; k <= j; k++)
 thisSum += A[k];
 if (thisSum > maxSum)
 maxSum = thisSum;
 }
 }
 return maxSum;
}
int main(void)
{
 int* a = NULL;
 int N;
 scanf("%d", &N);
 a = (int*)malloc(N * sizeof(int));
 for (int i = 0; i < N; i++)
 {
 scanf("%d", &a[i]);
 }
 printf("%d\n", Sum(a, N));
}

方法二

#include<stdio.h>
#include<malloc.h>
int Sum(int A[], int N)
{
 int maxSum, thisSum;
 maxSum = thisSum = 0;
 for (int i = 0; i < N; i++)
 {
 thisSum += A[i];
 if (thisSum > maxSum)
 {
 maxSum = thisSum;
 }
 else if (thisSum < 0)
 {
 thisSum = 0;
 }
 }
 return maxSum;
}
int main(void)
{
 int* a = NULL;
 int N;
 scanf("%d", &N);
 a = (int*)malloc(N * sizeof(int));
 for (int i = 0; i < N; i++)
 {
 scanf("%d", &a[i]);
 }
 printf("%d\n", Sum(a, N));
}

方法四 在线处理

#include<stdio.h>
#include<malloc.h>
#include<time.h>
clock_t start, endness;
double duration;
#define recyle_k 1e7
int Sum(int A[], int N, int* front, int* end)
{
 int maxSum, thisSum;
 maxSum = thisSum = 0;
 for (int i = 0; i < N; i++)
 {
 thisSum += A[i];
 if (thisSum > maxSum)
 {
 maxSum = thisSum;
 *end = i;
 }
 else if (thisSum < 0)
 {
 thisSum = 0;
 *front = i + 1;
 }
 }
 return maxSum;
}
int main(void)
{
 int* a = NULL;
 int N;
 int front, end;
 int result;
 scanf_s("%d", &N);
 front = 0, end = N;
 a = (int*)malloc(N * sizeof(int));
 for (int i = 0; i < N; i++)
 {
 scanf_s("%d", &a[i]);
 }
 start = clock();
 for (int i = 0; i < recyle_k; i++)
 {
 result = Sum(a, N, &front, &end);
 }
 endness = clock();
 duration = ((double)(endness - start)) / CLK_TCK / recyle_k;
 printf("消耗时间: %2.6e \n", duration);
 printf("最大和: %d\n", result);
 printf("子序列首尾:[%d, %d]", front, end);
 return 0;
}

关于 返回子序列首尾,不知道为什么总是不对,吐血

#include<stdio.h>
#include<malloc.h>

int Sum(int A[], int N, int* front, int* end)
{
    int maxSum = 0, thisSum = 0;
    int flag = 0, m = 0;  // flag 作为 全负数 标记 + -2 -3 5 0
    for (int i = 0; i < N; i++)
    {
        thisSum += A[i];
        if (thisSum < 0)
        {
            thisSum = 0;
        }
        else if (thisSum > maxSum)
        {
            maxSum = thisSum;
            *end = i;
        }
        if (A[i] == 0)
        {
            flag = 0;
            m = i;

        }
    }

    maxSum = thisSum > maxSum ? thisSum : maxSum;
    if (maxSum != 0)
    {
        thisSum = 0;
        for (int i = *end; i >= 0 ; i--)
        {
            thisSum += A[i];
            if (maxSum == thisSum)
            {
                *front = i;
            }
        }
    }
    else if (flag)
    {
        *front = 0;
        *end = N;
    }
    else {
        *front = m;
        *end = m;
    }
    return maxSum;
}
int main(void)
{
    int* a = NULL;
    int N;
    int front, end;
    int result;
    scanf("%d", &N);
    front = 0, end = N;
    a = (int*)malloc(N * sizeof(int));
    for (int i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }
    result = Sum(a, N, &front, &end);
    printf("%d %d %d ", result, front, end);
    return 0;
}

暂时先这样吧。纠结

原文地址:https://www.cnblogs.com/xmdykf/p/12322592.html

时间: 2024-10-17 17:36:33

PTA 程序设计题(数据结构第一章)的相关文章

数据结构第一章

证明数据结构分析中的结论的两个常用的方法时归纳法和反证法 归纳法:第一步是证明基准情形,就是确定定理对于某个小的值的正确性,(这一步几乎是很简单的 第二部,进行归纳假设,一般来说,这意味着假设定理对直到某个有限数k的所有的情况都成立的,然后使用这个假设证明定理对于下一个值也是成立的. 反证法:通过假设定理不成立,然后证明该假设导致某一个已知性质不成立,从而说明原假设是错误的. 反证法和归纳法不同处,归纳发从基础出发,反证法从结论出发. 什么是递归:当一个函数用他自己来定义时就称为是递归. 不是所

数据结构 第一章学习小结

数据结构   第一章学习小结 1.数据结构第1章的心得体会: 这周学习了数据结构的绪论及第一章.初步了解了数据结构与算法的相关概念,一开始看书看视频时觉得还挺抽象的,不能够完全理解.但是反复多看了几遍之后,结合例题,自己去操作去跑代码,慢慢觉得容易理解接受起来了.由于现在以网课形式进行教学,老师上课的同时基本还是靠自己去理解学习.当然老师也发挥很大的作用,比如让我们更深入的了解递归的空间复杂度为什么与问题规模有关,又怎样去找到该函数的临界值等等.既锻炼了我们深入思考的能力,也让我们更加清楚了解不

Java语言程序设计(基础篇)第一章

第一章 计算机.程序和Java概述 1.1引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(hardware)和软件(software)两部分.

数据结构第一章学习小结

第一章学习了一些基本概念以及它们之间的联系,对数据结构这门课程有了初步的了解.刚开始看书的时候,有很多地方不是很明白,对一些名词的解释也不懂,后来结合视频讲解才比较透彻.一开始不清楚ADT的作用,直到自己去写了一遍才有体会.当自己不懂或者不会的时候,一定要自己上手去写去打代码,才能明白困扰自己的那个点在哪里,通过查资料.看视频等等方式解决这个问题.数据结构和算法是相辅相成的,理解透彻基本的概念,才能为之后的学习铺路.这学期要肯花功夫,本来基础就不是很好,更应该笨鸟先飞.对概念的理解不透彻,或言之

《python语言设计程序设计》_第一章编程题

题目1.1 :显示"welcome to python " 答案:print('welcome to python') 题目1.2:显示"welcome to python " 五次 答案:print ("welcome to python\n") * 5  #\n表示换行,要是没有\n的话就会连接在一起 题目1.3:编写fun,其中fun是分别有fun组成. 答案:#注意,"N","N"和"NN

【javascript高级程序设计笔记】第一章与第三章

第1章 javascript简介 1.2Javascript实现 一个完整的javascript实现由下列三个不同的部分组成 核心(ECMAScript) 提供核心语言功能 文档对象模型(DOM) 提供访问和操作网页内容的方法和接口 浏览器对象模型(BOM)提供与浏览器交互的方法和接口 ECMAScript 它规定了这门语言的下列组成部分: 语法  类型  语句  关键字 保留字 操作符 对象 ECMA-262第5版,发布于2009年. 文档对象模型(DOM) Document Object M

数据结构-第一章 学习小结

一.心得体会: 1. 通过这周初步认识了数据结构,我大概了解了数据结构究竟要学什么,什么是算法(发现算法与我之前了解的算法还是有些出入),了解了数据结构与算法的紧密相关,了解了“程序=数据结构+算法”这道公式. 2.这是第一周网课,教学方式与之前的大有不同.网上上课完全靠大家的自觉.老师的上课方式我觉得挺好的,让大家自行看书结合视频学习再完成测验还有讨论.讨论这一块觉得挺好的,会让我们复习一下视频所学的内容. 3. 总结学习内容 1) 数据结构 数据结构:数据结构包括逻辑结构和存储结构.其中逻辑

数据结构——第一章线性表:03线性表的链式存储结构

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC" } span.s1 { font: 12.0px Helvetica } span.s2 { color: #fb0207 } 1.单链表:用一组地址任意的存储单元存放线性表中的数据元素.以元素(数据元素的映象)+ 指针(指示后继元素存储位置)= 结点(表示数据元素). 2.以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针.为了

数据结构第一章绪论课后小练

题一: 判断n是否是一个素数,若是则返回逻辑值true,否则返回逻辑值false. package ch01; import java.util.Scanner; public class Part01 { public boolean prime(int a) { boolean flag=true; if(a==1) { flag=false; } for(int i=2;i<a-1;i++) { if(a%i==0) { flag=false; break; } } return flag