1.把数组排成最小的数
class Solution { public: static bool compare(const string& s1, const string& s2) { string t1 = s1 + s2; string t2 = s2 + s1; return t1 <= t2? true : false; } string PrintMinNumber(vector<int> numbers) { string str; int i, len = numbers.size(); if (len<1) return str; string res; vector<string> vt; for (i = 0;i<len;++i) { stringstream stream; stream << numbers[i]; stream >> str; vt.push_back(str); } sort(vt.begin(), vt.end(), compare); for (i = 0;i<len;++i) res += vt[i]; return res; } };
这里使用string会比使用char*更加快捷方便。
另外使用sort而不是qsort,主要是sort是qsort的升级,且参数更少,不需要制定每个参数占据的内存空间大小。
2.字符流中第一个不重复的字符
少有的一遍通过的程序,眼泪都快流下来了
class Solution { public: Solution():index(0){ //初始化位置 for(int i=0;i<256;++i) pos[i]=-1; } //Insert one char from stringstream void Insert(char ch) { if(pos[ch]==-1) pos[ch]=index; else if(pos[ch]>=0) pos[ch]=-2; ++index; } //return the first appearence once char in current stringstream char FirstAppearingOnce() { char res='#'; int minv=1e8,i; //设置字符串max值 for(i=0;i<256;++i){ if(pos[i]>=0&&pos[i]<minv){ //若是当前位置小于min,则对min进行更新 res=(char)i; minv=pos[i]; } } return res; } private: int index; int pos[256]; };
3.求滑动窗口最大值
还是不能一遍通过,而且思维定式,真的很难找到错误的
class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { int i,j,k,len=num.size(); vector<int> result; if(len<size||size==0) return result; int max=num[0]; for(i=1;i<size;++i){ //先寻找第一个窗口的最大值 if(max<num[i]) max=num[i]; } result.push_back(max); for(i=1;i<=(len-size);++i){ j=i+size-1; if(num[j]<max){ //判断最大值是否移出滑动窗口 if(num[i-1]!=max) result.push_back(max); else{ //确定最大值被移出滑动窗口,重新确定最大值 max=num[i]; for(k=i;k<=j;++k){ if(num[k]>max) max=num[k]; } result.push_back(max); } }else{ result.push_back(num[j]); max=num[j]; } } return result; } };
4.表示数值的字符串(最耗人心力的程序,没有之一)
有空多做几遍,绝对练耐心
class Solution { public: bool isdigit(const char& ch){ if(ch<='9'&&ch>='0') return true; else return false; } void scandigits(char** str){ while(**str!='