# | 题目简介 | 解法 | 边界条件 |
1 | <Two Sum>给定一个数组nums和一个目标的和target,要求从nums中找出两个数的索引,使得它们的和为target | 1.遍历法,对于任意一个nums里面的数字都遍历一遍数组,查找是否存在另外一个数和它相加为target,复杂度是O(n^2) 2.用hashmap来加快速度,每次访问到数组的一个元素x时就查找hashmap中是否存在target-x的key,如果存在则返回对应的两个下标,否则把该元素放到hashmap中 | 无 |
3 | 给定一个字符串,查找它的最长不包含重复字符的子串的长度 | 1.遍历,同时用一个HashMap存储每一个遇到的字符(key)和它的索引(value),如果已经存在这个字符则把HashMap中该字符索引之前的字符都删除,并比较当前最大长度是否为最大长度 2.对1进行优化:新增一个变量start记录当前最长子串的开始索引,每当遇到HashMap中重复的字符时,不删除其中的元素,而是让start赋值为start与该字符的索引两者间的较大值,即重新从重复字符处或者原start处开始计算最长子串,那么新的最大长度length = Math.max(length, currentIndex - start) | 字符串为null或者长度为0 |
7 | 反转一个int数字,例如123反转为321,-123反转为-321 | 把负数转为正数,然后while循环依次从低位到高位分离每一个位数digit,并且重新赋值给最终结果为result = result*10 + digit。要使用long类型来记录result以避免溢出 | 当该数字为int的最小值时,反转为正数会溢出。若最后结果大于int最大值或者小于int最小值需要返回0,否则long转int返回时会得到不正确的结果 |
9 | 判断一个int数字是否是回文 | 若数字为负数则直接返回false,若非负则用+""的方式把数字转为字符串,然后循环比较左边和右边的字符,知道left指针>=right指针为止。 | 负数不是回文,如果采用先反转int再比较的方法,则需要注意反转后的int越界的问题 |
12 | 把一个int数字转为罗马数字表示 | 1.用两个char数组分别记录个十百千位上的高低位字符,用求模的方法获取到个十百千上的每一位,然后把每一位根据大小来转换为字符串 2.使用枚举类型分别记录临界值,如M(1000),CM(900),D(500),CD(400),C(100),XC(90),L(50),XL(40),X(10),IX(9),V(5),IV(4),I(1)。从最大数开始减,例如大于M就减1000,直到小于1000为止就开始尝试减900,每减一次就让最终结果的字符串加上对应的字符 | |
13 | 罗马数字转换为int数字 | 从右到左遍历每一个字符c,如果当前字符对应的值是小于它右边的字符的,则result减去这个字符对应的int值,否则result加上对应的int值 | 字符串为null或空时返回0 |
14 | 求一个字符串数组String[] strs中的最长公共前缀 | 把每一个string都先用toCharArray()方法获取到char数组(这样会比每次都用charAt()函数访问字符要快,因为charAt每次都要判断是否越界,对于每一个字符都增加了额外的操作),然后比较每个char数组的对应位的字符是否相等,如果都相等则添加该字符到StringBuffer中,如果遇到index超过某个char数组的下标则结束,返回buffer.toString() | 数组下标不能越界,可以用try块包裹访问操作,省去多余的判断,捕获到异常时直接将buffer的string返回 |
21 | 合并两个已近排好序的list | 创建一个新的节点指针指向两个list中更小的头元素,然后同时遍历两个list,如果l1<l2,则移动l1,反之移动l2,每次指针移动之后都修改新list的元素引用,直到其中一个list结束,然后把另外一个list剩下的元素连接到之前的结果 | 其中一个或者两个list都为空可以直接返回相应的结果 |
26 | 在一个排好序的数组nums中删除重复的元素,返回剩下元素的个数 | 1.把每个元素都放到HashSet中,最后返回set的size即可 2.由于是排好序的,所以从第二个元素开始遍历,用两个指针,i为顺序,currentIndex为当前可以赋值的index,每个元素和之前的元素比较是否相同,不相同则nums[currentIndex] = nums[i];同时currentIndex++,相同则不处理,i会自增1,currentIndex不变,用于标志当前位置可以存储一个不同的值 | 数组长度为0 |
27 |