NC1 大数加法
描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围:s.length,t.length≤100000s.length,t.length≤100000,字符串仅由'0'~‘9’构成
要求:时间复杂度 O(n)O(n)
示例1
输入:
"1","99"
返回值:
"100"
说明:
1+99=100
示例2
输入:
"114514",""
返回值:
"114514"
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here s长 t短
int carry = 0, a = 0, b = 0;
Integer sum = 0;
StringBuilder res = new StringBuilder();
if(s.length() < t.length()) {
String temp = s;
s = t;
t = temp;
}
for(int i = s.length() - 1, j = t.length() - 1; i >= 0; i--, j--) {
a = s.charAt(i) - '0';
if(i < s.length() - t.length()) {
b = 0;
} else {
b = t.charAt(j) - '0';
}
sum = a + b + carry;
if(sum > 9 && i == 0) {
carry = 1;
} else if (sum > 9) {
carry = 1;
sum -= 10;
} else {
carry = 0;
}
res.insert(0, sum);
}
return res.toString();
}
}
NC127 最长公共子串
描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
数据范围: 1≤∣str1∣,∣str2∣≤50001≤∣str1∣,∣str2∣≤5000
要求: 空间复杂度 O(n2)O(n2),时间复杂度 O(n2)O(n2)
示例1
输入:
"1AB2345CD","12345EF"
返回值:
"2345"
备注:
1≤∣str1∣,∣str2∣≤5 0001≤∣str1∣,∣str2∣≤5000
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
public String LCS (String str1, String str2) {
// write code here str1短 str2 长
int[][] dp = new int[str1.length()+1][str2.length()+1];
int maxlen = 0;
int maxIdx = 0;
for(int i = 0; i < str1.length(); i++) {
for(int j = 0; j < str2.length(); j++) {
if(str1.charAt(i) == str2.charAt(j)) {
dp[i+1][j+1] = dp[i][j] + 1;
if(dp[i+1][j+1] > maxlen) {
maxlen = dp[i+1][j+1];
maxIdx = i;
}
} else {
dp[i+1][j+1] = 0;
}
}
}
return str1.substring(maxIdx-maxlen + 1, maxIdx + 1);
}
}
NC66 两个链表的第一个公共结点
描述
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
数据范围: n≤1000n≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:
可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。
输入描述:
输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分。 后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。
返回值描述:
返回传入的pHead1和pHead2的第一个公共结点,后台会打印以该节点为头节点的链表。
示例1
输入:
{1,2,3},{4,5},{6,7}
返回值:
{6,7}
说明:
第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分 这3个参数最后在后台会组装成为2个两个无环的单链表,且是有公共节点的
示例2
输入:
{1},{2,3},{}
返回值:
{}
说明:
2个链表没有公共节点 ,返回null,后台打印{}
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode l1 = pHead1, l2 = pHead2;
while (l1 != l2) {
l1 = (l1 == null) ? pHead2 : l1.next;
l2 = (l2 == null) ? pHead1 : l2.next;
}
return l1;
}
}