1. 两数之和 :
题目 : https://leetcode-cn.com/problems/two-sum/
O(n)算法实现:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] ans = new int[2] ;
Map<Integer,Integer> bt = new HashMap<>() ;
for (int i= 0 ;i <nums.length ;i++){
if(bt.containsKey( target - nums[i]) ){
return new int[]{i, bt.get(target - nums[i])} ;
}
else{
bt.put(nums[i],i) ;
}
}
return ans;
}
}
2. 两数相加 :
题目 : https://leetcode-cn.com/problems/two-sum/
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ans = new ListNode() ;
//边界情况处理
if(l1 == null && l2 == null) return ans;
if(l1 == null) return l2;
if(l2 == null) return l1;
//开始构建ans指向的链表,ans是头节点
ListNode current = ans ;
//记录进位数
int carry = 0 ;
//两个链表都还有值
while(l1 != null && l2 != null){
int v1 = l1.val ;
int v2 = l2.val ;
ListNode thisNode = new ListNode( (v1 + v2 + carry)%10 ) ;
current.next = thisNode ;
current = current.next;
l1 = l1.next;
l2 = l2.next;
carry = (v1 + v2 + carry)/10 ;
}
//链表2有值
while(l2 != null){
int v2 = l2.val;
ListNode thisNode = new ListNode( (v2 + carry)%10 ) ;
current.next = thisNode ;
current = current.next;
l2 = l2.next;
carry = (v2 + carry)/10 ;
}
//链表1有值
while(l1 != null){
int v1 = l1.val;
ListNode thisNode = new ListNode( (v1 + carry)%10 ) ;
current.next = thisNode ;
current = current.next;
l1 = l1.next;
carry = (v1 + carry)/10 ;
}
if(carry > 0) {
ListNode thisNode = new ListNode( carry ) ;
current.next = thisNode ;
current = current.next;
}
ans = ans.next ; //注意这一步
return ans;
}
}
3.整数反转 :
整数反转思路class Solution {
public int reverse(int x) {
int ans = 0 ;
while(x != 0){
//如果已经达到了Integer.MAX_VALUE/10的级别,那么下个迭代肯定越界了
if(ans > Integer.MAX_VALUE/10 || ans < -1 * Integer.MAX_VALUE/10)
{
return 0 ;
}
int dig = x % 10 ;
x = x/10 ;
ans = ans * 10 + dig ;
}
return ans ;
}
}
4. 字符串转换整数 (atoi)
题目地址 : https://leetcode-cn.com/problems/string-to-integer-atoi/
该题是中等难度,我写出了思路,但是因为溢出条件测试了很久都没有通过,这里溢出时,需要注意,必须测试ans 和 Integer.MAX_VALUE/10的大小关系,不能判断相加结果与Integer.MAX_VALUE的关系,因为相加溢出后,直接值就变了。该题还有个难点,就是int的最大值是2147483647,如果加完之后等于 2147483646 那就不溢出了,所以这里判断溢出的条件是:ans > Integer.MAX_VALUE/10 || (ans == Integer.MAX_VALUE/10 && lg > 7)
下边是完整的代码 :
class Solution {
public int myAtoi(String s) {
//去除空格
String clearStr = s.trim() ;
if(clearStr.length() == 0) return 0 ;
//ans保存最终的数字和,flag表示输出正数还是负数
int ans = 0 , flag = 1 , lg =0 ;
//处理第一位为 + 或者 - 的情况
if(clearStr.charAt(0) == '+' || clearStr.charAt(0) == '-'){
flag = clearStr.charAt(0) == '+' ? 1:-1;
clearStr = clearStr.substring(1) ;
}
char[] chList = clearStr.toCharArray() ;
for(char p : chList){
//这里的判断char是数字的字符的方法,值得记下来
if (p >= '0' && p <= '9'){
lg = p - 48;
//这里的越界判断,测试了很久,需要注意
if(ans > Integer.MAX_VALUE/10 || (ans == Integer.MAX_VALUE/10 && lg > 7)){
ans = flag == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE ;
return ans;
}
else{
ans = ans*10 + lg ;
}
}
else{
//非数字字符'0'~'9'直接退出了
return ans * flag ;
}
}
return ans*flag ;
}
}
5. 回文数
题目地址: https://leetcode-cn.com/problems/palindrome-number/
这个题目非常简单,做了一次通过。核心是判断回文字符串的一个方法,我的方法是将String转化为Char Array,从第一个元素迭代到中间,分别比对 i 和 length-i 如果不一样就不是回文,否则是回文。
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) return false ;
char[] cx = String.valueOf(x).toCharArray() ;
if (cx.length == 1) return true ;
/**
* 4444
*/
int len = cx.length;
int mid = cx.length/2;
boolean flag = true;
for (int i =0;i<mid;i++){
if(cx[i] != cx[len-1-i]){
flag = false ;
break;
}
}
return flag ;
}
}
网友评论