OJ记录册

目录

1、只出现一次的数字

2、杨辉三角

3、删除有序数组中的重复项

4、只出现一次的数字 II

5、只出现一次的数字 III

6、数组中出现次数超过一半的数字

7、电话号码的字母组合


1、只出现一次的数字

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sz = nums.size();
        int a = nums[0];
        for(int i = 1;i <sz;i++)
        {
            a = a ^ nums[i];
        }
        return a;
    }
};

2、杨辉三角

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> v(numRows);//开辟numRows个子数组
        for(int i = 0;i<numRows;i++)//外层for负责行的变化
        {
            v[i].resize(i + 1); //第i行就给第i个子数组开辟i+1个空间,多余空间用于存放'\0'
            v[i][0] = v[i][i] = 1;//每个数组的首尾有效元素均为1      
            for(int j = 1;j<i;j++)//内层for负责每一行的具体变化,i=2时才会有内部数据相加
            {
                v[i][j] =  v[i-1][j] + v[i-1][j-1];//v[i-1]调用上一个数组中的v[j]和v[j-1]位置的数得到v[i]中的[j]位置的值
            }
        }
          return v;//返回填充好的vector
    }
  
};

3、删除有序数组中的重复项

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int fast = 1, slow = 1;//从第二个字符开始比较,slow记录单独出现的元素个数
        while (fast < n) 
        {
            if (nums[fast] != nums[fast - 1]) 
            {
                nums[slow] = nums[fast];
                ++slow;//每找到一个新发现的数就将该数赋值给slow,同时slow++
            }
            ++fast;//跳过相同的数据
        }
        return slow;
    }
};

4、只出现一次的数字 II

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sz =nums.size();
        vector<int>::iterator it = nums.begin();
        while(it!=nums.end())//双指针,左指针不动右指针负责遍历计数
        {
            int a = 0;

            for(int i = 0;i < sz;i++)
            {
                if(*it == nums[i])//满足三次的数不是我们要的
                    ++a;
            }
            if(a!=3)
                return *it;
            ++it;
        }
        return 0;
    }
};

5、只出现一次的数字 III

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int xorsum = 0;
        for (int num: nums) 
        {
            xorsum ^= num;//xorsum = 单独数1 ^ 单独数2,其余的全部抵消
        }

        // 防止溢出?
        int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum));

        int type1 = 0, type2 = 0;
        for (int num: nums) 
        {
            if (num & lsb) 
            {
                type1 ^= num;
            }
            else 
            {
                type2 ^= num;
            }
        }
        return {type1, type2};//C++11多参数类型隐式类型转换
    }
};

6、数组中出现次数超过一半的数字

#include <iterator>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        int sz = numbers.size();
     
        vector<int>::iterator it = numbers.begin();
        while(it != numbers.end())
        {
           int sum = 0;//每轮将标记位重置
           for(int i = 0;i < sz; i++)
            {
                if((*it) == numbers[i])
                {
                    ++sum;
                }
            }
            if(sum > sz / 2)
            {
                return *it;
            }

            ++it;//最后移动迭代器
        }
        return 0;
    }
};

7、电话号码的字母组合

class Solution {
public:
    string tmp;//字符串尾插
    vector<string> res;//将尾插好的字符串成组尾插给res
    vector<string> board={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    void DFS(int pos,string digits)//深度优先遍历
    {
        if(pos==digits.size())//当digits的每个有效字符都递归并尾插后返回
        {
            res.push_back(tmp);
            return;
        }
        
        int num=digits[pos]-'0';

        for(int i=0;i<board[num].size();i++)
        {
            tmp.push_back(board[num][i]);
            DFS(pos+1,digits);
            tmp.pop_back();//尾删,只删除一个
        }
    }


    vector<string> letterCombinations(string digits) 
    {
        if(digits.size()==0) 
        {
            return res;
        }
        DFS(0,digits);
        return res;
    }
};

~over~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SJTU OJ是上海交通大学在线评测系统的简称。它是一个提供给学生练习编程和解决问题的平台。 首先,学生需要注册并登录SJTO OJ系统。系统会为每个注册用户分配一个唯一的用户ID和密码,以保证账户安全。 上机编程练习是SJTO OJ的主要功能之一。学生可以在系统中选择不同的编程题目,例如算法题、数据结构题、数学题等等。每道题目都附带了详细的题目描述和输入输出样例。学生需要根据题目要求,编写相应的程序,并在系统中提交代码。系统会自动编译和运行学生提交的代码,并对其进行评测。评测结果包括通过样例的数量、程序运行时间、内存占用等信息。 除了上机编程练习,SJTO OJ还提供了一些其他功能。例如,学生可以查看自己的解题记录和成绩,统计自己的编程能力和进步情况。他们可以参加在线比赛,与其他学生一同竞争,提高自己的编程水平。 作为一名学生,使用SJTO OJ可以有效地提升自己的编程技能和解决问题的能力。通过参与编程练习和比赛,学生可以不断学习新知识,发现并改进自己的不足之处。此外,SJTO OJ还为学生提供了一个交流的平台,他们可以与其他学生分享自己的解题思路和经验。 总之,SJTO OJ是一个非常有用的在线评测系统,通过使用它,学生可以提高自己的编程能力,并享受与其他同学交流和竞争的乐趣。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值