废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串相加】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。
名曲目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍。
字符串相加【EASY】
感觉很多数据结构都有要相加或合并的计算逻辑
题干
解题思路
算法流程: 设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法;
- 计算进位: 计算 carry = tmp / 10,代表当前位相加是否产生进位;
- 添加当前位: 计算 tmp = n1 + n2 + carry,并将当前位 tmp % 10 添加至 res 头部;
- 索引溢出处理: 当指针 i或j 走过数字首部后,给 n1,n2 赋值为 0,相当于给 num1,num2 中长度较短的数字前面填0,以便后续计算。
- 当遍历完 num1,num2 后跳出循环,并根据 carry 值决定是否在头部添加进位 1,最终返回 res 即可。
复杂度分析:
- 时间复杂度 O(max(M,N)):其中 M,N 为 数字长度,按位遍历一遍数字(以较长的数字为准);
- 空间复杂度 O(1):指针与变量使用常数大小空间。
代码实现
给出代码实现基本档案
基本数据结构:字符串
辅助数据结构:无
算法:迭代
技巧:无
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 计算两个数之和* @param s string字符串 表示第一个整数* @param t string字符串 表示第二个整数* @return string字符串*/public String solve (String s, String t) {int i = s.length() - 1;int j = t.length() - 1;int cnt = 0;StringBuilder res = new StringBuilder("");while (i >= 0 || j >= 0) {// 1 计算当前总和,如果其中一个字符串用完了则补0int n = i >= 0 ? s.charAt(i) - '0' : 0;int m = j >= 0 ? t.charAt(j) - '0' : 0;int curSum = n + m + cnt;// 2 计算进位值cnt = (curSum) / 10;// 3 设置当前位值res.append(curSum % 10);// 4 移动指针i--;j--;}// 字符串都用完后,发现还有进位值,则再补充1if (cnt > 0) {res.append(1);}return res.reverse().toString();}
}
复杂度分析
时间复杂度 O(N):遍历了两个字符串,O(N)阶
空间复杂度 O(1):只用到常量