【复习61-66题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十四天 44/50

专注 效率 记忆
预习 笔记 复习 做题

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)

文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔

如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458

本题出自 acwing网站

这个系列是免费的

打卡即刻退回费用。

第四十四天【剑指Offer例题代码 系列】

    • [61. 数组中只出现一次的两个数字【异或 相同的为0】](#61. 数组中只出现一次的两个数字【异或 相同的为0】)
    • [62. 数组中唯一只出现一次的数字](#62. 数组中唯一只出现一次的数字)
        • [方法一:统计每一位中 1出现的个数](#方法一:统计每一位中 1出现的个数)
        • 方法二:循环
    • [63. 和为S的两个数字【unordered_set<int>】](#63. 和为S的两个数字【unordered_set<int>】)
        • unordered_set<int>
        • [利用hash.count 和 hash.insert](#利用hash.count 和 hash.insert)
        • unordered_map
        • [利用find != mp.end() 和 mp[x] = a;](#利用find != mp.end() 和 mp[x] = a;)
    • [64. 和为S的连续正数序列【双指针】](#64. 和为S的连续正数序列【双指针】)
    • [65. 翻转单词顺序【微软面试题】](#65. 翻转单词顺序【微软面试题】)
    • [66. 左旋转字符串](#66. 左旋转字符串)

61. 数组中只出现一次的两个数字【异或 相同的为0】

java 复制代码
class Solution {
public:
    vector<int> findNumsAppearOnce(vector<int>& nums) {
        int sum = 0;
        for (auto x : nums) sum ^= x;
        int k = 0;
        while (!(sum >> k & 1)) k ++ ;
        int first = 0;
        for (auto x : nums)
            if (x >> k & 1)
                first ^= x;
        return vector<int>({first, sum ^ first});
    }
};

62. 数组中唯一只出现一次的数字

方法一:统计每一位中 1出现的个数

java 复制代码
class Solution {
public:
    int findNumberAppearingOnce(vector<int>& nums) {
        int ans = 0;
        for (int i = 31; i >= 0; --i) {
            int cnt = 0;
            for (int x: nums) {
                if (x >> i & 1) {
                    cnt ++;
                }
            }
            if (cnt % 3 == 1) {
                ans = (ans * 2) + 1;
            }
            else {
                ans = ans * 2;
            }
        }
        return ans;
    }
};

方法二:循环

每一位出现的1的次数 要么是 3k 要么是3k+1

那么我们就通过异或

使得3k的1都异或成0

由于数组个数一定是3k+1

那么只要我们让3k异或成0

那么1一定保留

所以我们就让循环规律为3个一循环

java 复制代码
class Solution {
public:
    int findNumberAppearingOnce(vector<int>& nums) {
        int ones = 0, twos = 0;
        for (auto x : nums)
        {
            ones = (ones ^ x) & ~twos;
            twos = (twos ^ x) & ~ones;
        }
        return ones;
    }
};

63. 和为S的两个数字【unordered_set】

unordered_set

利用hash.count 和 hash.insert

cpp 复制代码
class Solution {
public:
    vector<int> findNumbersWithSum(vector<int>& nums, int target) {
        unordered_set<int> hash;
        for (auto x : nums)
        {
            if (hash.count(target - x)) return vector<int>{target - x, x};
            hash.insert(x);
        }
        return vector<int>();
    }
};

unordered_map

利用find != mp.end() 和 mp[x] = a;

cpp 复制代码
class Solution {
public:
    vector<int> findNumbersWithSum(vector<int>& nums, int target) {
        vector<int> ans;
        unordered_map<int,int> mp;
        for(auto x:nums){
            if(mp.find(target-x)!=mp.end())
            {
                ans.push_back(x);
                ans.push_back(target-x);
                return ans;
            }
            mp[x] = target-x;
        }
    }
};

64. 和为S的连续正数序列【双指针】

由于需要的是连续的

所以考虑双指针

cpp 复制代码
class Solution {
public:
    vector<vector<int> > findContinuousSequence(int sum) {
        vector<vector<int>> res;
        for (int i = 1, j = 1, s = 1; i <= sum; i ++ )
        {
            while (s < sum) j ++, s += j;
            if (s == sum && j > i)
            {
                vector<int> line;
                for (int k = i; k <= j; k ++ ) line.push_back(k);
                res.push_back(line);
            }
            s -= i;
        }
        return res;
    }
};

65. 翻转单词顺序【微软面试题】

字符串读入处理:全部读入,通过遍历处理

看样例

首先我们知道的是

一定是把输入的 全部翻转

但是翻转过来我们发现 所有单词也都是翻转的

所以我们先把所有单词翻转一遍

然后再整体翻转一遍

cpp 复制代码
class Solution {
public:
    string reverseWords(string s) {
        for (int i = 0; i < s.size(); i ++ )
        {
            int j = i;
            while (j < s.size() && s[j] != ' ') j ++ ;
            reverse(s.begin() + i, s.begin() + j);
            i = j;
        }
        reverse(s.begin(), s.end());
        return s;
    }
};

66. 左旋转字符串

cpp 复制代码
class Solution {
public:
    string leftRotateString(string str, int n) {
        reverse(str.begin(), str.end());
        reverse(str.begin(), str.begin() + str.size() - n);
        reverse(str.begin() + str.size() - n, str.end());
        return str;
    }
};
相关推荐
xiaoshiguang32 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡2 小时前
【C语言】判断回文
c语言·学习·算法
别NULL2 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇2 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos4 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习4 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA4 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo4 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc4 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游5 小时前
【算法day20】回溯:子集与全排列问题
算法