[学习笔记-C++篇]day12 lintcode50

50+100+针对训练。
感谢大佬几款优秀的支持C、C++在线编译器

此外,教程网站:九章算法课-免费试听可以闲的时候过渡一下,换换思路听着。

另,十大排序算法需要整理一下,参考:1.0 十大经典排序算法


stage2——4天进阶阶段

在线编译器:compile c++ gcc online
刷题网站:阶段1第一关:基本数据类型

day2 planA
lintcode 余3-4
教程完成度60%。


1.翻转字符串

复盘一下。对string的应用掌握不充分,需要整理string用法。

2.数组剔除元素后的乘积

思路在其中。

简单归纳一下:
1)学会用迭代器,vector<int>::iterator it;,迭代器赋初值一定要用it=obj.begin(),不能用it=&obj[i];,因为数据类型不一致
2)结合obj.erase(it);,即删除it迭代器指向的元素,此时it指针是不会改变的,只是obj中的元素被剔除掉1个,即元素前移,it指向的是删除掉的元素的后一个元素
3)插入指令obj.insert(it,1);it的位置处插入元素1
4)注意数据类型,比如这里的输出类型和累乘整型变量都应该是long long

class Solution {
public:
    /**
     * @param nums: Given an integers array A
     * @return: A long long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
     */
    vector<long long> productExcludeItself(vector<int> &nums) {
        // write your code here

        //初步思路,先剔除第i个,然后累乘,然后插入
        vector<int>::iterator it;//保存剔除元素
        it=nums.begin();//只能用这种取vector的地址函数去赋值,不然类型不对

        vector<long long> p;
        long long m;//累乘
        int tmp;//临时存放

        if(nums.size()==1) p.push_back(1);
        else
        {
            for(int i=0;i<nums.size();i++)
            {
                m=1;
                //cout << *it << endl;
                tmp=*it;
                nums.erase(it);//先剔除
                
                for(int j=0;j<nums.size();j++)//注意这里提出之后num.size()也发生变化但遍历累乘不需要-1
                {
                    m*=nums[j];
                }
                p.push_back(m);
                nums.insert(it,tmp);//再插入,erase剔除之后,it指针不变,但其中元素指向下一个元素了
                it++;
            }
        }

        return p;
    }
};

3.主元素

简单思路整理:先判断是不是一个元素,是直接返回;不是就先排序,然后累积某一元素数目,一旦大于阈值就返回,否则判断到第i个元素不是该元素,不是就重新累积。

class Solution {
public:
    /**
     * @param nums: a list of integers
     * @return: find a  majority number
     */
    int majorityNumber(vector<int> &nums) {
        // write your code here
        
        //思路:先排序,然后统计每种类型数据数目,一旦找到就返回
        if(nums.size()==1) return nums[0];
        
        int j=nums.size()/2;//判断变量

        sort(nums.begin(),nums.end());
        int tmp;//存储元素
        int n=0;//存储元素数目
        int i=0;//遍历索引
    
        while(n<=j)
        {
            tmp=nums[i];
            n=count(nums.begin(),nums.end(),tmp);
            while(nums[++i]==tmp){}
        }
        return tmp;
    }
};

4.Fizz Buzz问题

要点在于数字和字符串之间的转换:

字符串转数字stoi()eg. int i; string str; x=stoi(str);,头文件string,数据类型不限;
数字转字符串to_string()eg. str=to_string(x);,但是尽量不要用浮点数,因为会保留小数6位;
字符串数字互转<sstream>的stringstreameg. int x; string str; stringstream ss; x >> ss; ss >> str;,或者str >> ss; ss >> x;,数据类型不限。

class Solution {
public:
    /**
     * @param n: An integer
     * @return: A list of strings.
     */
    vector<string> fizzBuzz(int n) {
        // write your code here
        
        vector<string> s;

        for(int i=1;i<=n;i++)
        {
            if(i%3==0 && i%5==0) s.push_back("fizz buzz");
            else if(i%3!=0 && i%5!=0) s.push_back(to_string(i));
            else if(i%3!=0) s.push_back("buzz");
            else s.push_back("fizz");
        }
         return s;
    }
};

5.转换字符串到整数(容易版)

和上面一样。

class Solution {
public:
    /**
     * @param target: A string
     * @return: An integer
     */
    int stringToInteger(string &target) {
        // write your code here
        return stoi(target);
    }
};

6.大小写转换2

参考[学习笔记-C++篇]day4 plus(刷题篇)

仍旧考察字符判断函数。

class Solution {
public:
    /**
     * @param letters: A string
     * @return: A string
     */
    string lowercaseToUppercase2(string &letters) {
        // write your code here

        //遍历字符串元素判断
        string lu;

        for(int i=0;i<letters.size();i++)
        {
            if( islower(letters[i]) ) lu.push_back(letters[i]-32);
            else lu.push_back(letters[i]);
        }
        return lu;
    }
};

7.字符串查找

主要考察stringfind查找函数。参见[学习笔记-C++篇]day9 STL教程整理。

class Solution {
public:
    /**
     * @param source: 
     * @param target: 
     * @return: return the index
     */
    int strStr(string &source, string &target) {
        // Write your code here

        int pt;

        pt=source.find(target);
        if(pt==-1)    return -1;
        else return pt;

    }
};

8.转换成小写字母

和前面第6题考查的内容一样。

class Solution {
public:
    /**
     * @param str: the input string
     * @return: The lower case string
     */
    string toLowerCase(string &str) {
        // Write your code here
        string t;

        for(int i=0;i<str.size();i++)
        {
            if(isupper(str[i])) t.push_back(str[i]+32);
            else t.push_back(str[i]);
        }

        return t;
    }
};

9.两字符串和

考查字符和数字转换:

不能用字符串和数字转换的方法。

字符转数字:char c; int i=c-'0';,注意,减去的是字符'0',不是数字。
数字转字符:int i; char c=i+'0';,注意,加上的还是字符'0',不是数字。

class Solution {
public:
    /**
     * @param A: a string
     * @param B: a string
     * @return: return the sum of two strings
     */
    string SumofTwoStrings(string &A, string &B) {
        // write your code here

#if 1 //第1种
        
        int size=A.size()>B.size()?A.size():B.size();
        int sum;//每一位和
        string S;//保存结果

        int a=stoi(A),b=stoi(B);

        for(int i=0;i<size;i++)
        {
            sum=a%10+b%10;
            S=to_string(sum)+S;
            a/=10;
            b/=10;
        }

        return S;
#endif
    }
};

这种方法会遇到超出范围的情况,主要是stoi函数用法问题。
当字符串中有除了数字外的字符时,只会将这些字符前的数字转换为int
此外还有atoi函数,stoi的参数是const string*atoi的参数是const char*
stoi有检测范围的。

剩下的明天整理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值