ACM基础之线性结构:一刷 参考答案

Remove Duplicates from a Array

import java.util.Arrays;
import java.util.Scanner;
import java.util.Scanner;
public class Main {
    public static int removeDuplicates(int A[], int n) {
        if (n == 0) return 0;
        int index = 0;
        for (int i = 1; i < n; i++) {
            if (A[index] != A[i])
                A[++index] = A[i];
        }
        return index + 1;
    }

    public static void main(String[] args) {
        Scanner myScan = new Scanner(System.in);
        int arrNum = myScan.nextInt();
        int myArr[] = new int[arrNum];
        for (int i = 0; i < arrNum; i++) {
            myArr[i] = myScan.nextInt();
        }

        Arrays.sort(myArr);

        int index = removeDuplicates(myArr, myArr.length);
        System.out.println(index);
        for (int i = 0; i < index; i++) {
            if (i < index - 1) {
                System.out.print(myArr[i] + " ");
            } else
                System.out.print(myArr[i]);
        }
    }
}

Median of Two Sorted Arrays

参考代码 C++ 李祥
// #include<bits/stdc++.h>

#include<iostream>
#include<algorithm>
#include<vector>
#include<cctype>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<queue>
#include<sstream>
using namespace std;

int main(){
    vector<int> a;
    int n;
    cin >> n;
    a.push_back(n);
    stringstream ss;
    string str;
    getline(cin, str);
    ss.clear();
    ss.str(str);
    char c;
    while (ss >> c >> n){
        a.push_back(n);
    }
    cin >> n;
    a.push_back(n);
    getline(cin, str);
    ss.clear();
    ss.str(str);
    while (ss >> c >> n){
        a.push_back(n);
    }
    sort(a.begin(), a.end());
    int mid;
    if (a.size() % 2){
        mid = a.at(a.size() / 2);
    }
    else{
        mid = a.at(a.size() / 2) + a.at(a.size() / 2 - 1);
        mid /= 2;
    }
    cout << "Median is " << mid << endl;
    return EXIT_SUCCESS;
}

考试问题(线性表)

参考代码 Java

import java.util.*;
class Student{
    String name;
    float score[]=new float[3];
}
public class Main {
    private static Scanner sc;
    public static void main(String[] args) {
        List<Student> list=new ArrayList<Student>();
        sc = new Scanner(System.in);
        float m;
        m = sc.nextFloat();
        while (sc.hasNext()) {
            Student stu=new Student();
            stu.name=sc.next();
            stu.score[0]=sc.nextFloat();
            stu.score[1]=sc.nextFloat();
            stu.score[2]=sc.nextFloat();
            list.add(stu);
        }

        for(int i=0 ;i<list.size();i++)
        {
            if(list.get(i).score[0]+list.get(i).score[1]+list.get(i).score[2]>=180){
                System.out.println(list.get(i).name+" -- pass exam");
            }
        }
        for(int i=0 ;i<list.size();i++)
        {
            if(list.get(i).score[0]+list.get(i).score[1]+list.get(i).score[2]<180){
                System.out.println(list.get(i).name+" -- not pass exam");
            }
        }
        for(int i=0 ;i<list.size();i++)
        {
            if(list.get(i).score[0]+list.get(i).score[1]+list.get(i).score[2]==300){
                System.out.println(list.get(i).name+" -- 3 x 100.0");
            }
        }
    }
}

C李祥

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    char name[32];
    float mark[3];
} ST;

int main()
{
    ST *all_st;
    float f1, f2, f3;
    int N, i;
    scanf("%d", &N);
    all_st = (ST *)malloc(N * sizeof(ST));
    for (i = 0; i < N; i++){
        scanf("%s %f %f %f", &all_st[i].name, &f1, &f2, &f3);
        all_st[i].mark[0] = f1;
        all_st[i].mark[1] = f2;
        all_st[i].mark[2] = f3;
    }

    for (i = 0; i < N; i++){
        f1 = all_st[i].mark[0] + all_st[i].mark[1] + all_st[i].mark[2];
        if (f1 >= 180.0) {
            printf("%s -- pass exam\n", all_st[i].name);
        }
    }

    for (i = 0; i < N; i++){
        f1 = all_st[i].mark[0] + all_st[i].mark[1] + all_st[i].mark[2];
        if (f1 < 180.0) {
            printf("%s -- not pass exam\n", all_st[i].name);
        }
    }

    for (i = 0; i < N; i++){
        f1 = all_st[i].mark[0] + all_st[i].mark[1] + all_st[i].mark[2];
        if (f1 >= 300.0) {
            printf("%s -- 3 x 100.0\n", all_st[i].name);
        }
    }
    return EXIT_SUCCESS;
}

找相同元素(线性表)

#include<iostream>
using namespace std;
int main()
{
    int n1, n2, n3;
    int i, j, t = 0, b = 0, a = 0;
    int t1 = 0, t2 = 0, t3 = 0;
    int t11 = 0, t22 = 0, t33 = 0;
    cin >> n1;
    int *p1 = new int[n1];
    for (i = 0; i<n1; i++)
        cin >> p1[i];
    cin >> n2;
    int *p2 = new int[n2];
    for (i = 0; i<n2; i++)
        cin >> p2[i];
    cin >> n3;
    int *p3 = new int[n3];
    for (i = 0; i<n3; i++)
        cin >> p3[i];
    int *p11 = new int[n1];
    for (i = 0; i<n1; i++)
    {
        if (p1[i] != p1[i + 1])
        {
            p11[t1] = p1[i];
            t1++;
        }
    }
    int *p22 = new int[n2];
    for (i = 0; i<n2; i++)
    {
        if (p2[i] != p2[i + 1])
        {
            p22[t2] = p2[i];
            t2++;
        }
    }
    int *p33 = new int[n3];
    for (i = 0; i<n3; i++)
    {
        if (p3[i] != p3[i + 1])
        {
            p33[t3] = p3[i];
            t3++;
        }
    }

    int *p111 = new int[n1 + n2];
    for (i = 0; i<t1; i++)
    {
        for (j = 0; j<t2; j++)
        {
            if (p11[i] == p22[j])
            {
                p111[t11] = p11[i];
                t11++;
            }
        }
    }
    int *p = new int[t1 + t2 + t3];
    for (i = 0; i<t11; i++)
    {
        for (j = 0; j<t3; j++)
        {
            if (p111[i] == p33[j])
            {
                p[t33] = p111[i];
                t33++;
            }
        }
    }

    for (i = 0; i<t33; i++)
        cout << p[i] << " ";
}

Java代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
    static Scanner cin = new Scanner(System.in);
    public static void main(String[] args) {
        int an = cin.nextInt();
        List<Integer> aList = new ArrayList<Integer>();
        Map<Integer, Boolean> aMap = new HashMap<Integer, Boolean>();
        for (int i = 0; i < an; i++) {
            int a = cin.nextInt();
            if (aMap.get(a) == null) {
                aList.add(a);
                aMap.put(a, true);
            }
        }
        int bn = cin.nextInt();
        List<Integer> bList = new ArrayList<Integer>();
        Map<Integer, Boolean> bMap = new HashMap<Integer, Boolean>();
        for (int i = 0; i < bn; i++) {
            int b = cin.nextInt();
            if (bMap.get(b) == null) {
                bList.add(b);
                bMap.put(b, true);
            }
        }
        int cn = cin.nextInt();
        List<Integer> cList = new ArrayList<Integer>();
        Map<Integer, Boolean> cMap = new HashMap<Integer, Boolean>();
        for (int i = 0; i < cn; i++) {
            int c = cin.nextInt();
            if (cMap.get(c) == null) {
                cList.add(c);
                cMap.put(c, true);
            }
        }
        List<Integer> list1 = new ArrayList<Integer>();
        Map<Integer, Boolean> map1 = new HashMap<Integer, Boolean>();
        for (int i = 0; i < bList.size(); i++) {
            int t = bList.get(i);
            if (aMap.get(t) != null) {
                list1.add(t);
                map1.put(t, true);
            }
        }
        List<Integer> list2 = new ArrayList<Integer>();
        for (int i = 0; i < cList.size(); i++) {
            int t = cList.get(i);
            if (map1.get(t) != null) {
                list2.add(t);
            }
        }
        Collections.sort(list2);
        for (int i = 0; i < list2.size(); i++) {
            System.out.print(list2.get(i) + " ");
        }
    }
}

交换节点(线性表)

提示

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        ArrayList<Integer> list2 = new ArrayList<Integer>();
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int a[] = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = cin.nextInt();
            list1.add(a[i]);
        }
        int m = cin.nextInt();
        Collections.swap(list1, m - 1, m);
        for (int i = 0; i < list1.size(); i++) {
            System.out.print(list1.get(i) + " ");
        }
    }
}

----------------

# include <iostream>
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

LinkList CreatList(LinkList L, int n){
    LinkList p, s;
    int i;
    L = new LNode;
    L->next = NULL;
    s = L;
    for (i = n; i > 0; i--)
    {
        p = new LNode;
        std::cin >> p->data;
        p->next = s->next;
        s->next = p;
        s = p;
    }
    s->next = L;
    return L;
}

void ExchangeList(LinkList L, int m) {
    int count = 1;
    ElemType e;
    LinkList cur;
    cur = L->next;
    while (1)  {
        if (count == m) {
            if (cur->next == L) {
                e = L->next->data;
                L->next->data = cur->data;
                cur->data = e;
                break;
            }
            e = cur->next->data;
            cur->next->data = cur->data;
            cur->data = e;
            break;
        }
        cur = cur->next;
        count++;
    }
}

void PrintList(LinkList L){
    LinkList p;
    p = L->next;//如果没有这句就非法输出了一个NULL出现错误报告
    while (p != L) {
        std::cout << p->data;
        if (p->next != L)std::cout << ‘ ‘;
        p = p->next;
    }
}
int main(){
    LinkList L;
    int n, m;
    std::cin >> n;
    L = CreatList(L, n);
    //  PrintList(L);
    std::cin >> m;
    ExchangeList(L, m);
    PrintList(L);
    return 0;
}

最快合并链表(线性表)

待完善…

Longest Consecutive Sequence

Java 代码

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
    static Scanner cin = new Scanner(System.in);
    static void display(String[] s){
        System.out.print(s[0]);
        for (int i = 1; i < s.length; i++) {
            System.out.print(" "+s[i]);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        String[] s = cin.nextLine().split(" *, *");
        Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
        int max=Integer.parseInt(s[0]);
        int min=Integer.parseInt(s[0]);
        for (int i = 0; i < s.length; i++) {
            int t = Integer.parseInt(s[i]);
            if(t>max)max=t;
            if(t<min)min=t;
            if(map.get(t)==null){
                map.put(t, true);
            }
        }
        //System.out.println("max="+max+"\tmin="+min);
        int maxLen=1,maxEnd=min-1,len=0;
        for (int i = min; i <= max; i++) {
            if(map.get(i)!=null){
                len++;
                if(len>maxLen){
                    maxLen=len;
                    maxEnd=i;
                }
            }else{
                len=0;
            }
        }
        for (int i = maxEnd-maxLen+1; i < maxEnd; i++) {
            System.out.print(i+",");
        }
        System.out.println(maxEnd);
        System.out.println(maxLen);
    }
}
完整代码C++ 李祥
#include<iostream>
#include<algorithm>
#include<vector>
#include<cctype>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<queue>
#include<sstream>

using namespace std;
int main()
{
    vector<int> numbers;
    int x;
    char c;
    cin >> x;
    numbers.push_back(x);
    string str;
    getline(cin, str);
    stringstream ss;
    ss.clear();
    ss.str(str);
    while (ss >> c >> x){
        numbers.push_back(x);
    }
    sort(numbers.begin(), numbers.end());
    int ms1 = 0, ms2 = 0, mn1 = 1, mn2 = 1;
    for (int i = 1; i<numbers.size(); i++){
        if (numbers[i] - numbers[i - 1] == 1){
            mn2++;
        }
        else{
            if (mn1<mn2){
                mn1 = mn2;
                ms1 = ms2;
            }
            ms2 = i;
            mn2 = 1;
        }
    }
    if (mn1<mn2){
        mn1 = mn2;
        ms1 = ms2;
    }
    for (int i = ms1; i<ms1 + mn1 - 1; i++){
        cout << numbers[i] << ",";
    }
    cout << numbers[ms1 + mn1 - 1] << endl;
    cout << mn1 << endl;
    return EXIT_SUCCESS;
}

Two Sum 数组

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    static Scanner cin = new Scanner(System.in);

    static int[] convertStr2Int(String[] s) {
        int[] a = new int[s.length];
        for (int i = 0; i < a.length; i++) {
            a[i] = Integer.parseInt(s[i]);
        }
        return a;
    }

    static void display(String[] s) {
        System.out.print(s[0]);
        for (int i = 1; i < s.length; i++) {
            System.out.print(" " + s[i]);
        }
        System.out.println();
    }

    public static void main(String[] args) {
        String[] s = cin.nextLine().split(" *, *");
        int[] a = convertStr2Int(s);
        int target = cin.nextInt();
        // display(s);
        int index1 = -1, index2 = -1;
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = i + 1; j < a.length; j++) {
                if (a[i] + a[j] == target) {
                    if (index1 == -1) {
                        index1 = i + 1;
                        index2 = j + 1;
                    }
                    if (a[i] < a[j]) {
                        index1 = i + 1;
                        index2 = j + 1;
                    }
                }
            }
        }
        System.out.println("[" + index1 + ", " + index2 + "]");
    }
}

Implement strStr() 字符串

#include <iostream>
#include <cstring>
using namespace std;

void getNext(const char *patten, int next[]) {
    int i = 0, j = -1;
    next[i] = j;
    while (patten[i] != ‘\0‘) {
        while (j >= 0 && patten[j] != patten[i])
            j = next[j];
        ++i; ++j;
        next[i] = j;
    }
}

int kmpSearch(const char *s, const char *p, const int next[]) {
    int i = 0, j = 0;
    int pos = -1;
    while (s[i] != ‘\0‘) {
        while (j >= 0 && s[i] != p[j])
            j = next[j];
        ++i; ++j;
        if (p[j] == ‘\0‘) {
            pos = i - j;
            cout << s[i - j] << endl;;
            return pos;
        }
    }
    return pos;
}

int main() {
    char p[1024], s[1024];
    int *next;
    cin >> s >> p;
    next = new int[strlen(p) + 1];
    getNext(p, next);
    cout << kmpSearch(s, p, next) << endl;
    return 0;
}

Largest Rectangle in a Histogram

建议用栈和队列 :

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        int[] num = {2,1,5,6,2,3};
        System.out.println(largestRectangleArea(num));
    }

    public static int largestRectangleArea(int heights[]) {
        if (heights.length == 0) return 0;
        if (heights.length == 0) return heights[0];
        int ans = 0;
        int n = heights.length;
        int left[] = new int[n + 1];
        int right[] = new int[n + 1];
        processLR(heights, left, right);
        for (int i = 1; i <= n; i++) {
            int tmp = (right[i] - left[i] + 1) * heights[i - 1];
            if (ans < tmp)
                ans = tmp;
        }

        return ans;
    }

    public static int processLR(int heights[], int left[], int right[]) {
        int n = heights.length;
        //用临时数组,设置两个哨兵
        int tempArr[] = new int[n + 2];
        tempArr[0] = -1;
        for (int i = 1; i <= n; i++) tempArr[i] = heights[i - 1];
        tempArr[tempArr.length - 1] = -1;

        for (int i = 1; i <= n; i++) {
            int k = i;
            while (tempArr[i] <= tempArr[k - 1])
                k = left[k - 1];
            left[i] = k;
        }

        for (int i = n; i > 0; i--) {
            int k = i;
            while (tempArr[i] <= tempArr[k + 1])
                k = right[k + 1];
            right[i] = k;
        }

        return 0;
    }
}
时间: 2024-12-17 18:06:52

ACM基础之线性结构:一刷 参考答案的相关文章

Mooc数据结构-基础和线性结构

1 数据结构 解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据对象必定与一系列加在其上的操作相关联 完成这些操作所用的方法就是算法 抽象数据类型(Abstract Data Type) 数据类型 数据对象集 数据集合相关联的操作集 抽象: 描述数据类型的方法不依赖与具体实现 与存放数据的机器无关 与数据存储的物理结构无关 与实现操作的算法和编程语言无关

2、线性结构——数据结构【基础篇】

线性结构 线性结构的4大特点: 1.有一个结点只有前驱 2.有一个结点只有后继 3.其他结点既有一个前驱也有一个后继 4.在逻辑上相邻在物理上也相邻数据的逻辑关系叫做线性结构 线性结构的3大类型: 1.线性表--线性表是n个数据元素的有限序列 存储结构: 顺序存储对应一组操作:顺序表 链式存储对应一组操作:单向链表.双向链表.循环链表 2.栈--限定只在表的一端(表尾)进行插入和删除操作的线性表:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),其这一端被固定了. 存储结构

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

一步一步写算法(之线性结构的处理)

原文:一步一步写算法(之线性结构的处理) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 我们知道,在内存中的空间都是连续的.也就是说,0x00000001下面的地址必然是0x00000002.所以,空间上是不会出现地址的突变的.那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆.数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理.所以从这个意义上说,掌握了数组才能说明你数据结构入门了. 那么,

13. C#数据结构与算法 -- 线性结构

本文中,我们讨论了三个部分的内容: 什么是线性结构,线性结构有哪些特点 . 详细介绍了一个最简单线性结构顺序表,并且通过源代码进行一些的分析. 最后还举了一个例子,让我们更好的理解顺序表. 第一部分:什么是线性结构,线性结构有哪些特点 什么是线性结构,线性结构是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这 种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素

数据结构第二讲:线性结构

参考:浙大数据结构(陈越.何钦铭)课件 1.线性表及其实现 有一个很好的问题可以方便的说明引入链表的好处,那就是一元多项式:f(x) = a0 + a1x + an-1xn-1 + anxn 的表示及运算(两个多项式相加/相减/相乘等),显然我们可以利用数组来解决这个问题,两个多项式相加就是两个数组对应分量相加.但是这引入了一个很严重的问题,如何表示多项式x + 3x2000呢?开这么大的数组明显会造成空间浪费. 解决上面遗留的问题的一个方法是用结构数组按指数大小有序存储,每一个数组元素维护两个

2017-2018-1 20162316刘诚昊 实验一 线性结构

20162316刘诚昊 2017-2018-2 <Java程序设计>第一次实验 线性结构 线型结构-1 ArrayList和LinkedList测试: 查看ArrayList和LinkedList的Java API帮助文档,参考http://www.cnblogs.com/rocedu/p/4837092.html 用Junit对ArrayList和LinkedList的方法进行测试,要尽量覆盖正常情况,异常情况,边界情况 提交单元测试运行截图,要全屏,包含学号信息 链接:https://gi

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外

常见的线性结构

目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现"括号匹配"问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言 ??本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间