剑指offer-day10
把数字翻译成字符串
有一点像青蛙跳台阶,但是递归条件有点不一样。
维护三个指针a=f(0)=1、b=f(1)=1、c = 1,遍历整个数字(为了方便遍历需要把数字转为字符串),从第二个数字开始,如果该数字和前一个数字组成的数>=10且<=25,说明这个数字的翻译方法有f(0)+f(1)种,否则只有f(1)种。c的值等于这个数的翻译方法,此时c指向该数字,a指向b,b指向c,循环至遍历结束。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public int translateNum(int num) { String s = String.valueOf(num); int a = 1; int b = 1; int c = 1; for(int i = 1; i < s.length(); i++){ int n = Integer.parseInt(s.substring(i-1,i+1)); if(n >= 10 && n <= 25){ c = a + b; } else{ c = b; } a = b; b = c; } return c; } }
|
最长不含重复字符的子字符串
自己写了一个虽然过了,但是时空复杂度真的丢人…算是一个暴力解吧。
同样是动态规划思想,用一个哈希表来记录每个字符最后出现的位置,遍历整个字符串,获得一个字符过去出现的最后位置和现在出现的位置,相减获得重复前的子字符串长度。用一个数tmp来记录。最后返回每次记录后tmp的最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public int lengthOfLongestSubstring(String s) { Map<Character,Integer> map = new HashMap<>(); int tmp = 0; int res = 0; for(int i = 0; i < s.length(); i++){ int j = map.getOrDefault(s.charAt(i),-1); map.put(s.charAt(i),i); if(tmp < i - j){ tmp++; } else{ tmp = i - j; } res = Math.max(tmp,res); } return res; } }
|