Loading

11.13

leetcode

328. 奇偶链表

难度中等327

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例 1:

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

示例 2:

输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL

说明:

  • 应当保持奇数节点和偶数节点的相对顺序。
  • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

解答:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(!head || !head->next)return head;
        auto oh = head, ot = oh;
        auto eh = head->next, et = eh;
        for(auto p = head->next->next; p;){
            ot = ot->next = p;
            p = p->next;
            if(p){
                et = et->next = p;
                p = p->next;
            }
        }
        ot->next = eh;
        et->next = NULL;
        return oh;
    }
};

387. 字符串中的第一个唯一字符

难度简单288

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

示例:

s = "leetcode"
返回 0

s = "loveleetcode"
返回 2

提示:你可以假定该字符串只包含小写字母。

解答:

class Solution {
public:
    int firstUniqChar(string s) {
        map<int, int>cnt;
        for(int i = 0; i < s.size(); i++)cnt[s[i]]++;
        for(int i = 0; i < s.size(); i++){
            if(cnt[s[i]] == 1){
                return i;
                break;
            }
           
        }
        return -1;
    }
};

29. 两数相除

难度中等454

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2

提示:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

解答;快速幂思想

class Solution {
public:
    int divide(int x, int y) {
        typedef long long LL;
        vector<LL>exp;
        bool flag = false;
        LL res = 0;
        if(x > 0 && y < 0 || x < 0 && y > 0)flag = true;
        LL a = abs((LL)x), b = abs((LL)y);
        for(LL i = b; i <= a; i = i + i)exp.push_back(i);
        for(int i = exp.size() - 1; i >= 0; i--){
            if(a >= exp[i]){
                a = a - exp[i];
                res += 1ll << i;
            }
        }
        if(flag)res = -res;
        if(res > INT_MAX || res < INT_MIN)return INT_MAX;
        return res;
    }
};
posted @ 2020-11-13 18:29  桥木  阅读(93)  评论(0)    收藏  举报