力扣前五题

//for循环的解决方法
class Solution {
    public int[] twoSum(int[] nums, int target) {
        for(int i = 0; i < nums.length - 1; i++){
            for(int j = i + 1; j < nums.length - 1; j++){
                if(nums[i] + nums[j] == target){
                    return new int[]{i,j};
                }
            }
        }
        return new int[0];
    }
}
//哈希表
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> hashtable = new HashMap<>();
        //忘了加上=号
        for(int i = 0; i <= nums.length - 1; i++){
            //注意方法后面大小写,有时候写错了、、、、、、
            if(hashtable.containsKey(target - nums[i])){
                return new int[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i], i);
        }
        return new int[0];
    }
}

哈希表的作用其实主要还是应用在保存两种变量的时候。

/**
 * 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; }
 * }
 */
 //两个链表相加得到一个新的链表,而且是一个有头节点的。
 //所以就要先定义一个头节点,再弄一个辅助指针。也就是头节点先指向辅助指针,然后辅助指针继续创造节点。
 //选一个两个数中的一个进行赋值,用三目运算符。
 //小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0); 
        ListNode cur = pre;
        int carry = 0;
        while (l1 != null || l2 != null){
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            // if (pre == null){
            //     //head = new ListNode(sum % 10);
            //     tail = new ListNode(sum % 10);
            //     head = tail;
            // } else {
            cur.next = new ListNode(sum % 10);
            cur = cur.next;
            // }
            carry = sum / 10;
            if (l1 != null){
                //这边的等于理解成指向的意思,怕忘记标注一下。
                l1 = l1.next; 
            }
            if (l2 != null){
                l2 = l2.next;
            }
        }
        if (carry > 0){
            cur.next = new ListNode(carry);
            //tail = tail.next;
        }
        return pre.next;
    }
}

 节点是前节点指向后节点,并非赋值啊。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s == null) return 0;
        HashMap<Character,Integer> map = new HashMap<>();
        int left = 0;
        int max = 0;
        //length()需要加上括号
        for (int i = 0; i <= s.length() - 1; i++) {
            if(map.containsKey(s.charAt(i))){
                //是map中的字符!!!一直想怎么定位到重复字符出现的第一次的位置
                left = Math.max(left ,map.get(s.charAt(i)) + 1);
            }
            map.put(s.charAt(i),i);
            max = Math.max(max ,i - left + 1);
        }
        return max;
    }
}

 和第一题应用的hashmap比较类似

这个题目是滑动窗口。将字符串挨个往hashmap中放置,直至放置完全,拿出所求的最大的值。好好理解一下,怎么回到最开始重复字符串出现的位置。

 

//暴力求解,列举所有的子串,判断是否为回文串,保存最长的回文串。
class Solution {
    public boolean isPalindromic(String s) {
		int len = s.length();
        //重点理解这边找对称的字符串,还有就是,把写法从<=x -1,改成< x吧。
		for (int i = 0; i < len / 2; i++) {
			if (s.charAt(i) != s.charAt(len - i - 1)) {
				return false;
			}
		}
		return true;
	}
    public String longestPalindrome(String s) {
        String ans = "";
        int max = 0;
        int len = s.length();
        for (int i = 0; i < len; i++)
            for (int j = i + 1; j <= len; j++) {
                String test = s.substring(i, j);
                if (isPalindromic(test) && test.length() > max) {
                    ans = s.substring(i, j);
                    max = Math.max(max, ans.length());
                }
            }
        return ans;
    }
}

 

class Solution {
    public String convert(String s, int numRows) {
        if(numRows == 1) return s;
        List<StringBuilder> rows = new ArrayList<>();
        for(int i = 0; i < numRows; i++){
            rows.add(new StringBuilder());
        } 
        int curRow = 0;
        boolean goingDown = false;
        for(char x : s.toCharArray()){
            rows.get(curRow).append(x);
    //这边吊炸天,直接就是0.1.2..行数轮回给值,然后ArrayList集合中的泛型才设置成StringBuilder。
            if(curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
            curRow = goingDown ? curRow + 1 : curRow - 1;
        }
        StringBuilder res = new StringBuilder();
        for (StringBuilder x : rows) res.append(x);
        return res.toString();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值