头像

HX_6




离线:23小时前



HX_6
6天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
class Solution {
public:
    char firstNotRepeatingChar(string s) {
        map<char,int> mp;
        for(int i=0;i<s.size();i++){
            mp[s[i]]++;
        }
        for(int i=0;i<s.size();i++){
            if(mp[s[i]]==1) return s[i];
        }
        return '#';
    }
};



HX_6
6天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
class Solution {
public:
    int digitAtIndex(int n) {


        // 一位数有10个:0-9
        // 二位数有90个:10-99
        // 三位数有900个:100-999
        // 。。。依次类推
        // 1. 确定是几位数 n -10 -90*2 -900*3-.....
        // 2.确定是哪个数的  1255 = 1000+256-1
        // 3.属于那个数的第几位。

        // i是位数。s表示这一位有几个数,base表示这个段位从哪个数开始

        // 整数有限制,21474647,,9位。

        long long i =1,s =9,base =1;
        // 确定是几位数
        while(n >i*s){
            n -= i*s;
            i++;
            s *=10;
            base *= 10;
        }
        // i位数的第n个数字是属于哪个数,,,,下取整。
        int number  = base + (n+i-1)/i-1;
        int r = n%i? n%i:i;//判断是倒数第几位

        // 把后面的数都去掉最后%10 就是所求的那个数
        for(int j =0;j<i-r;j++){
            number /=10;
        }
        return number %10;        

    }
};



HX_6
7天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
class Solution {
public:
    int getMissingNumber(vector<int>& nums) {
        // // 二分 Ologn  遍历On
        // if(nums.size() ==0) return 0;
        // // 思路一: 用数学的方法做,少一个数。则两个sum相减就是这个数
        // if(nums.size() ==1 && nums[0] == 0) return 1;
        // if(nums[0] !=0) return 0;

        // // 这个连续的情况一直写不对。
        // int flag =-1;
        // for(int i=1;i<nums.size();i++){
        //     if(nums[i]-nums[i-1] > 1) {
        //         flag =1;break;
        //     }
        // }
        // if(flag == -1)
        //     return nums.size();
        // int t =0 ;
        // for(auto x: nums){
        //     t = max(t,x);
        // }
        // int sum=0,sum2=0;//一定要初始化,否则结果不对。
        // for(int i=0;i<=t;i++){
        //     sum += i;
        // }
        // // cout<< sum<<endl;
        // if(flag == -1) sum += nums.size();
        // // cout<<sum<<endl;
        // for(auto x: nums){
        //     sum2 +=x;
        // }
        // return sum -sum2;

        // 此题最优解法使用二分法,利用 i==nums[i]?? 这个特性来变化范围。最终要考虑若这个数组都有序,需要nums.size();
        if(nums.empty()) return 0;
        int left =0,right =nums.size()-1;
        int mid;
        while(left <  right){ //left 和right移动的时候,想分成 [left,mid].[mid+1,right]
             mid = left +right >>1;//更新是在while里面更新
            if(mid !=nums[mid]) right = mid;
            else left = mid+1;
        }
        if(nums[right] == right) return nums[right]+1;
        return right;
    }
};




HX_6
7天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
class Solution {
public:
    vector<int> findNumbersWithSum(vector<int>& nums, int target) {
        set<int> s;
        vector<int> res;
        for(int i=0;i<nums.size();i++){
            s.insert(nums[i]);
        }
        for(auto x: nums){
            if(s.find(target-x) !=s.end()) {
                res.push_back(x),res.push_back(target-x);
                return res;
            }
        }
        return res;
    }
};



HX_6
7天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
class Solution {
public:
    vector<int> findNumsAppearOnce(vector<int>& data) {
        // //  相同的两个数异或结果是0.都是1的异或结果是1,其余是0.

        //  vector<int> ans;
        //  int res;
        //  for(auto x: data){
        //      res ^= x;
        //  }
        //  int pos=0;
        //  while(((res >>pos) &1) !=1){
        //      pos++;
        //  }
        //  int num1=0,num2=0;
        //  for(auto x: data){
        //      if(((x>>pos) &1) ==1) num1 ^=x;
        //      else num2 ^= x;
        //  }
        //  ans.push_back(num1);
        //  ans.push_back(num2);
        // return ans;

        // y总写法。 
        // 注意:不知道优先级的时候,把所有的小括号都整好。
        int sum =0;
        for(auto x: data){
            sum ^=x;
        }
        int k =0;
        while(((sum>>k)&1) ==0) k++;
        int first =0;
        for(auto x: data){
            if(((x>>k)&1) ==1) first ^=x;
        }
        return vector<int>{first,sum^first};
    }
};



HX_6
7天前

算法1

class Solution {
public:
    vector<int> findNumsAppearOnce(vector<int>& data) {
        //  相同的两个数异或结果是0.都是1的异或结果是1,其余是0.

         vector<int> ans;
         int res;
         for(auto x: data){
             res ^= x;
         }
         int pos=0;
         while(((res >>pos) &1) !=1){
             pos++;
         }
         int num1=0,num2=0;
         for(auto x: data){
             if(((x>>pos) &1) ==1) num1 ^=x;
             else num2 ^= x;
         }
         ans.push_back(num1);
         ans.push_back(num2);
     return ans;
    }
};


活动打卡代码 AcWing 71. 二叉树的深度

HX_6
8天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    // 思路:用层序遍历,每层计数加一。最后的结果就是层数。
    int res = 0;
    int treeDepth(TreeNode* root) {
        if(!root) return 0;
        bfs(root);
        return res;

    }

    void bfs(TreeNode* root){
        if(!root) return ;
        queue<TreeNode*> q;
        q.push(root);
        while(q.size()){
            int n = q.size();
            res++;
            for(int i=0;i<n;i++){
                TreeNode* temp;
                temp = q.front();
                q.pop();

                if(temp->left) q.push(temp->left);
                if(temp->right) q.push(temp->right);
            }
        }
    }
};



HX_6
8天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int temp ;
    TreeNode* res;
    TreeNode* kthNode(TreeNode* root, int k) {
        // 中序遍历,到第n个的时候弹出来就ok了
        temp = k;

        dfs(root);
        return res;
    }
    void dfs(TreeNode* root){
        if(!root) return ;
        dfs(root->left);
        temp--;
        if(temp ==0) {
            res = root;
            return ;
        }

        dfs(root->right);
    }
};


活动打卡代码 AcWing 78. 左旋转字符串

HX_6
8天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
class Solution {
public:
    string leftRotateString(string str, int n) {
        if (str.size() == 0) return str;

        swap(str, 0, n - 1);
        swap(str, n, str.size() - 1);
        swap(str, 0, str.size() - 1);

        return str;
    }
    void swap(string& str,int i,int j){

        while (i<j){// 这里不能用swap(str[i],str[j]),报错是无法从char类型的初始化string& 的引用
            char temp = str[i];
            str[i] = str[j];
            str[j] = temp;
            i++, j--;
        }
    }
};


活动打卡代码 AcWing 77. 翻转单词顺序

HX_6
8天前
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
class Solution {
public:
    // 用双指针做,具体忘了。
    string reverseWords(string s) {
        reverse(s.begin(),s.end());
        int j=0;
        for(int i=0;i<s.size();i++){
            j=i;
            while(j<s.size() &&s[j] !=' '){
                j++;
            }
            //这里注意一下,字符串的reverse用法。
            reverse(s.begin()+i,s.begin()+j);
            i = j;
        }
        return s;
    }
};