acm刷题第二天

博客围绕LeetCode上两非空链表表示非负整数相加问题展开。给出示例,阐述基本思路,包括将int型转成链表表型及链表逐项相加。还给出Java代码实现,涉及链表构建、两链表相加逻辑,处理不同位数情况。

题目来源:https://leetcode-cn.com/problems/add-two-numbers/

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

这里用Java解决

基本思路:
1、链表式整数构建:用“%”和“/”从int型转成链表表型
2、2个链表各从头(个位)开始,逐项相加

代码实现(这里2个加数位数必须相同):

package array_int;
import java.math.BigInteger;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
public class TextClass {
public static void main(String[] args)
{
int number=0;
Scanner reader = new Scanner(System.in);
number = reader.nextInt();
LinkedList n1=new LinkedList();
while(number!=0)
{
int temp=number%10;
String s = temp+"";
n1.add(new BigInteger(s));
number/=10;
}
number = reader.nextInt();
LinkedList n2=new LinkedList();
while(number!=0)
{
int temp=number%10;
n2.add(new BigInteger(temp+""));
number/=10;
}
Plus plus = new Plus();
LinkedList n3=new LinkedList();
n3=plus.add(n1, n2);
Iterator iter1= n1.iterator();
Iterator iter2= n2.iterator();
Iterator iter3= n3.iterator();
while(iter1.hasNext())
System.out.print(iter1.next().intValue());
System.out.println();
while(iter2.hasNext())
System.out.print(iter2.next().intValue());
System.out.println();
while(iter3.hasNext())
System.out.print(iter3.next().intValue());
}
}

package array_int;
import java.math.BigInteger;
import java.util.Iterator;
import java.util.LinkedList;
public class Plus {
LinkedList add(LinkedList n1,LinkedList n2)
{
LinkedList n3=new LinkedList();
Iterator iter1= n1.iterator();
Iterator iter2= n2.iterator();
int carry=0;//上一位的进位
while(iter1.hasNext() && iter2.hasNext())
{
BigInteger int1= iter1.next();
BigInteger int2= iter2.next();
int newint=int1.intValue()+int2.intValue()+carry;
if (newint>=10)
{
n3.add(new BigInteger(newint-10+""));
carry=1;
}
else
{
n3.add(new BigInteger(newint+""));
carry=0;
}
}
if(!iter1.hasNext())//如果是数组2在之前的运算中完结
{
while(iter1.hasNext())
{
BigInteger int1= iter1.next();
int newint=int1.intValue()+carry;
n3.add(new BigInteger(newint+carry+""));
if (newint>=10)
{
n3.add(new BigInteger(newint-10+""));
carry=1;
}
else
{
n3.add(new BigInteger(newint+""));
carry=0;
}
}
if(carry == 1 )
{
n3.add(new BigInteger(“1”));
}
}
else//如果是数组1在之前的运算中完结
{
while(iter2.hasNext())
{
BigInteger int2= iter2.next();
int newint=int2.intValue()+carry;
n3.add(new BigInteger(newint+carry+""));
if (newint>=10)
{
n3.add(new BigInteger(newint-10+""));
carry=1;
}
else
{
n3.add(new BigInteger(newint+""));
carry=0;
}
}
if(carry==1)
{
n3.add(new BigInteger(“1”));
}
}
return n3;
}
}

### ACM系统 ER图设计与数据库建模 在设计ACM系统的实体关系图(ER图)时,需要明确系统中的主要实体及其之间的关系。以下是一个可能的ER图设计方案: #### 实体与属性 1. **用户 (User)** - 用户ID (UserID) [^1] - 用户名 (Username) - 密码 (Password) - 邮箱 (Email) - 注册时间 (RegistrationTime) 2. **目 (Problem)** - 目ID (ProblemID) [^1] - 目标 (Title) - 目描述 (Description) - 输入格式 (InputFormat) - 输出格式 (OutputFormat) - 示例输入 (SampleInput) - 示例输出 (SampleOutput) - 时间限制 (TimeLimit) - 内存限制 (MemoryLimit) 3. **提交记录 (Submission)** - 提交ID (SubmissionID) [^1] - 用户ID (UserID) - 目ID (ProblemID) - 提交时间 (SubmissionTime) - 状态 (Status) - 代码 (Code) 4. **标签 (Tag)** - 标签ID (TagID) [^1] - 标签名 (TagName) 5. **比赛 (Contest)** - 比赛ID (ContestID) [^1] - 比赛名称 (ContestName) - 开始时间 (StartTime) - 结束时间 (EndTime) #### 实体间的关系 1. **用户与提交记录**:一个用户可以提交多个记录,一条提交记录只能属于一个用户。这是多对一的关系。 2. **目与提交记录**:一个目可以被多次提交,一条提交记录只能对应一个目。这是多对一的关系。 3. **目与标签**:一个目可以有多个标签,一个标签可以属于多个目。这是多对多的关系。 4. **比赛与目**:一个比赛可以包含多个目,一个目可以属于多个比赛。这是多对多的关系。 #### 数据库表设计 以下是基于上述ER图的数据库表设计: ```sql -- 用户表 CREATE TABLE User ( UserID INT PRIMARY KEY AUTO_INCREMENT, Username VARCHAR(50) NOT NULL UNIQUE, Password VARCHAR(255) NOT NULL, Email VARCHAR(100) NOT NULL UNIQUE, RegistrationTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 目表 CREATE TABLE Problem ( ProblemID INT PRIMARY KEY AUTO_INCREMENT, Title VARCHAR(255) NOT NULL, Description TEXT NOT NULL, InputFormat TEXT NOT NULL, OutputFormat TEXT NOT NULL, SampleInput TEXT NOT NULL, SampleOutput TEXT NOT NULL, TimeLimit INT NOT NULL, MemoryLimit INT NOT NULL ); -- 提交记录表 CREATE TABLE Submission ( SubmissionID INT PRIMARY KEY AUTO_INCREMENT, UserID INT NOT NULL, ProblemID INT NOT NULL, SubmissionTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, Status ENUM('Accepted', 'Wrong Answer', 'Time Limit Exceeded', 'Runtime Error') NOT NULL, Code TEXT NOT NULL, FOREIGN KEY (UserID) REFERENCES User(UserID), FOREIGN KEY (ProblemID) REFERENCES Problem(ProblemID) ); -- 标签表 CREATE TABLE Tag ( TagID INT PRIMARY KEY AUTO_INCREMENT, TagName VARCHAR(50) NOT NULL UNIQUE ); -- 目-标签关联表 CREATE TABLE Problem_Tag ( ProblemID INT NOT NULL, TagID INT NOT NULL, PRIMARY KEY (ProblemID, TagID), FOREIGN KEY (ProblemID) REFERENCES Problem(ProblemID), FOREIGN KEY (TagID) REFERENCES Tag(TagID) ); -- 比赛表 CREATE TABLE Contest ( ContestID INT PRIMARY KEY AUTO_INCREMENT, ContestName VARCHAR(255) NOT NULL, StartTime DATETIME NOT NULL, EndTime DATETIME NOT NULL ); -- 比赛-目关联表 CREATE TABLE Contest_Problem ( ContestID INT NOT NULL, ProblemID INT NOT NULL, PRIMARY KEY (ContestID, ProblemID), FOREIGN KEY (ContestID) REFERENCES Contest(ContestID), FOREIGN KEY (ProblemID) REFERENCES Problem(ProblemID) ); ``` #### 设计说明 1. 使用了MySQL作为数据库管理系统[^1]。 2. 表之间的外键约束确保了数据的一致性。 3. 目与标签、比赛与目的多对多关系通过中间表实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值