LeetCode刷题(十二)-----字符串-------easy部分(Java、C++)
344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
思路一:C++详细题解
双指针,交换头尾两个指针所指的两个位置的值,指针向中间移动一个位置,重复以上操作,直到两个指针交错;
我的:
class Solution {
public:
void reverseString(vector<char>& s)
{
int i = 0;
int j = s.size()-1;
while(i < j)
{
swap(s[i],s[j]);
i++;
j--;
}
}
};
13. 罗马数字转整数
罗马数字包含以下七种字符:I,V,X,L,C,D和M。
例如,罗马数字2写做II,即为两个并列的1。12写做XII,即为X+II。 27写做XXVII, 即为XX+V+II。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: “III”
输出: 3
示例 2:
输入: “IV”
输出: 4
示例 3:
输入: “IX”
输出: 9
示例 4:
输入: “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路一:
程序:
class Solution {
public:
int romanToInt(string s) {
unordered_map<string, int> m = {{"I", 1}, {"IV", 3}, {"IX", 8}, {"V", 5}, {"X", 10}, {"XL", 30}, {"XC", 80}, {"L", 50}, {"C", 100}, {"CD", 300}, {"CM", 800}, {"D", 500}, {"M", 1000}};
int r = m[s.substr(0, 1)];
for(int i=1; i<s.size(); ++i){
string two = s.substr(i-1, 2);
string one = s.substr(i, 1);
r += m[two] ? m[two] : m[one];
}
return r;
}
};
代码行数:解析
1.构建一个字典记录所有罗马数字子串,注意长度为2的子串记录的值是(实际值 - 子串内左边罗马数字代表的数值)
2.这样一来,遍历整个 ss 的时候判断当前位置和前一个位置的两个字符组成的字符串是否在字典内,如果在就记录值,不在就说明当前位置不存在小数字在前面的情况,直接记录当前位置字符对应值
举个例子,遍历经过 IVIV 的时候先记录 II 的对应值 11 再往前移动一步记录 IVIV 的值 33,加起来正好是 IVIV 的真实值 44。max 函数在这里是为了防止遍历第一个字符的时候出现 [-1:0][−1:0] 的情况
作者:QQqun902025048
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/2-xing-python-on-by-knifezhu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
s.substr(a,b);意思是从字符串s下标为a开始去字符取出b个字符!
我的:
class Solution {
public:
int romanToInt(string s)
{
unordered_map<string,int> m = {{"I",1},{"V",5},{"X",10},{"L",50},{"C",100},{"D",500},{"M",1000},{"IV",3},{"IX",8},{"XL",30},{"XC",80},{"CD",300},{"CM",800}};
int r = m[s.substr(0,1)];
for(int i=1;i<s.size();i++)
{
string one = s.substr(i,1);
string two = s.substr(i-1,2);
r += m[two]? m[two]:m[one];
}
return r;
}
};
38.报数
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
-
1
-
11
-
21
-
1211
-
111221
1 被读作 “one 1”(“一个一”) , 即 11。
11 被读作 “two 1s”(“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1
输出: “1”
示例 2:
输入: 4
输出: “1211”
解析:
这题真的是有些奇葩,或者是我奇葩,根本没看懂,看了好几个评论才看懂~
• 1
• 2 描述的是1,是一个1,也就是11
• 3 描述的是11,是两个1,也就是21
• 4 描述的是21,是一个2一个1,也就是12-11
• 5 描述的是1211, 是一个1,一个2,两个1,也就是11-12-21
• 6 描述的是111221,是三个1,两个2,一个1,也就是31-22-11
• 7 描述的是312211,是一个3一个1两个2两个1,也即是13-11-22-21
• 以此类推
这题感觉上特别像是幼儿班或小学的题,需要思维比较清奇。
链接:https://leetcode-cn.com/problems/count-and-say/solution/bao-shu-by-gpe3dbjds1/
387. 字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = “leetcode”
返回 0.
s = “loveleetcode”,
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
思路一:
根据提示使用哈希映射
- 遍历一遍字符串记录每个字母出现的次数
- 遍历hashmap,找出第一个出现次数只有一次的字符 我的:
class Solution {
public:
int firstUniqChar(string s)
{
unordered_map <char,int> hashmap;
for(auto i:s)
{
if(hashmap.count(i))
{
hashmap[i] += 1;
}
else
{
hashmap[i] = 1;
}
}
for(int j = 0; s[j] != '\0';j++)
{
if(hashmap[s[j]] == 1)
{
return j;
}
}
return -1;
}
};