今天两道题难点都在读懂题目要求,思路并不难
165 Compare Version Numbers
class Solution {
public:
vector<vector<int>> getVersion(string s){
vector<vector<int>> v;
vector<int> current;
for(char ch : s){
//忽略前导零
if(ch == '0' && current.empty()){
continue;
}
//记录数值
if(ch != '.'){
current.push_back(ch-'0');
}else{
v.push_back(current);
current.clear();
}
}
v.push_back(current);
return v;
}
int vectorToInt(vector<int> num){
int res = 0;
int n = num.size();
if(n == 0){
return 0;
}
for(int i = 0 ; i < n ; i++){
res = res * 10 + num[i];
}
return res;
}
int compareVersion(string version1, string version2) {
/* 读题
//比较版本号-->修订号转为int 并忽略前导零
//从左到右一个个比较,忽略前导零
//如果v1<v2 -1 v1>v2 1 否则0*/
//主体遍历:单项思维:遇到.就比较后面的值转为int题目中都告诉了是肯定可以被int承载的
vector<vector<int>> v1 , v2;
v1 = getVersion(version1);
v2 = getVersion(version2);
//获取修订号:忽略前导零 且 拆分版本号
//遍历对应的v1[0] v2[0]要获取这俩的整数
int n1 = v1.size(), n2 = v2.size();
int n = max(n1, n2);
for(int i = 0 ; i < n;i++){
int num1 = i < n1 ? vectorToInt(v1[i]) : 0;
int num2 = i < n2 ? vectorToInt(v2[i]) : 0;
if(num1 > num2) return 1;
if(num1 < num2) return -1;
}
return 0;
}
};
c++代码学习
1. 二维数组的输入
vector<vector<int>> v;
vector<int> current;
先填满current 在v.push_back(current); current.clear();然后重复这个过程
2. 将数组中的数字组合为一个整数 pow会导致浮点数计算,尽量避免:
for(int i = 0 ; i < n ; i++){
res = res * 10 + num[i];
}
299 Bulls and Cows
class Solution {
public:
string getHint(string secret, string guess) {
/* 读题
//玩bulls & cows这个游戏
//我写一个数字 让我朋友猜
//猜了以后:bulls代表在正确位置且数字也对了A cows不在正确位置但是数字对了 B
//返回形式 "xAyB"x和y都有可能是三位数 不是个位数 */
string res = "";
int n = secret.size() , bulls =0 ,cows=0;
//判断bull公牛数
for(int i = 0 ; i < n ; i ++){
if(secret[i] == guess[i]){
bulls++;
secret[i] = 'b';
guess[i] = 'b';
}
}
//难点1:cows奶牛数的判别 数字对了但是位置不对,那就是说有多少个不重复的相同数字n^2
for(int i = 0 ; i < n ; i++){
char ch1 = secret[i];
if(!isdigit(ch1))continue;
for(int j = 0 ; j < n ; j++){
char ch2 = guess[j];
if(!isdigit(ch2))continue;
if(ch1 == ch2){
cows++;
guess[j] = 'c';
break;
}
}
}
//难点2:多位数字转字符 to_string
res.append(to_string(bulls));
res += 'A';
res.append(to_string(cows));
res += 'B';
return res;
}
};
时间复杂度为 O ( n 2 ) O(n^2) O(n2),官方题解中有为 O ( n ) O(n) O(n)的算法。这个是类似于之前建立26字母表计数的方法。【review 7.26 242 Valid Anagram几乎一模一样】思路练习:387 First Unique Character in a String 389 Find the Difference
class Solution {
public:
string getHint(string secret, string guess) {
int n = secret.size();
int bulls = 0 , cows = 0;
vector<int> secretCount(10 , 0) , guessCount(10 , 0);
for(int i = 0 ; i < n ; i ++){
if(secret[i] == guess[i]){
bulls++;
}
else{
secretCount[secret[i] - '0']++;
guessCount[guess[i] - '0']++;
}
}
//计算奶牛数
for(int i = 0 ; i <10 ; i++){
cows += min(secretCount[i] , guessCount[i]);
}
return to_string(bulls)+'A'+to_string(cows)+'B';
}
};