解法一:双指针
双指针遍历两个多项式,按照指数大小求和加入最终结果 ans
。注意处理和为0的情况和输出格式。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
private static float EXP = 1e-5f;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] input = reader.readLine().split(" ");
int lenA = Integer.parseInt(input[0]);
ArrayList<Item> A = new ArrayList<>(lenA);
for (int i = 1; i <= lenA; ++i) {
int exponent = Integer.parseInt(input[i * 2 - 1]);
float coef = Float.parseFloat(input[i * 2]);
A.add(new Item(exponent, coef));
}
input = reader.readLine().split(" ");
int lenB = Integer.parseInt(input[0]);
ArrayList<Item> B = new ArrayList<>(lenB);
for (int i = 1; i <= lenB; ++i) {
int exponent = Integer.parseInt(input[i * 2 - 1]);
float coef = Float.parseFloat(input[i * 2]);
B.add(new Item(exponent, coef));
}
ArrayList<Item> ans = new ArrayList<>(lenA);
int p1 = 0, p2 = 0;
while ((p1 < lenA) && (p2 < lenB)) {
int flag = A.get(p1).exponent - B.get(p2).exponent;
if (flag > 0) {
ans.add(A.get(p1++));
} else if (flag < 0) {
ans.add(B.get(p2++));
} else {
float sum = A.get(p1).coef + B.get(p2).coef;
if (!equalZero(sum)) {
ans.add(new Item(A.get(p1).exponent, sum));
}
++p1;
++p2;
}
}
while (p1 < lenA) {
if (!equalZero(A.get(p1).coef)) {
ans.add(A.get(p1++));
}
}
while (p2 < lenB) {
if (!equalZero(B.get(p2).coef)) {
ans.add(B.get(p2++));
}
}
System.out.print(ans.size());
for (Item i : ans) {
System.out.printf(" %d %.1f", i.exponent, i.coef);
}
}
private static boolean equalZero(float a) {
if (Math.abs(a) < EXP) {
return true;
}
return false;
}
}
class Item {
int exponent;
float coef;
Item() {
coef = 0.0f;
}
Item(int exponent, float coef) {
this.exponent = exponent;
this.coef = coef;
}
}