Leetcode - 205.同构字符串
题目:给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = “egg”, t = “add” 输出:true 示例 2:
输入:s = “foo”, t = “bar” 输出:false
我们的思路是,初始化两个数组为0,长度是有效字符的最大值,因为数组中存的是字符串中的字符;用sc和tc记录当前字符是否第一次出现,第一次出现就 sc和 tc,按照出现的顺序给它赋值;
比如abbc和babc,a和b第一次出现,那么hash1[a] 和 hash2[b]都为1; 第二个字符b和a,也是第一次出现,那么hash1[b] 和 hash2[a]都为2; 到第三个字符b和b,都是第二次出现,所以sc和tc不用 ,但是hash1[b] 和 hash2[b]不相等,所以返回false;
代码语言:javascript复制 bool isIsomorphic(char* s, char* t)
{
//初始化两个数组都为0,长度为有效字符的最大值
int hash1[127] = { 0 };
int hash2[127] = { 0 };
//sc和tc记录当前字符是否第一次出现,第一次出现就 sc和 tc,按照出现的顺序给它赋值
//比如abbc和babc,a和b第一次出现,那么hash1[a] 和 hash2[b]都为1;
//第二个字符b和a,也是第一次出现,那么hash1[b] 和 hash2[a]都为2;
//到第三个字符b和b,都是第二次出现,所以sc和tc不用 ,但是hash1[b] 和 hash2[b]不相等,所以返回false
int sc = 0, tc = 0;
for (int i = 0; i < strlen(s); i )
{
//判断是否第一次出现
if (hash1[s[i]] == 0)
{
hash1[s[i]] = sc;
}
//判断是否第一次出现
if (hash2[t[i]] == 0)
{
hash2[t[i]] = tc;
}
if (hash1[s[i]] != hash2[t[i]])
{
return false;
}
}
return true;
}
Leetcode - 228.汇总区间
题目:给定一个 无重复元素 的 有序 整数数组 nums 。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围[a, b] 应该按如下格式输出:
“a->b” ,如果 a != b “a” ,如果 a == b
示例 1:
输入:nums = [0, 1, 2, 4, 5, 7] 输出:[“0->2”, “4->5”, “7”] 解释:区间范围是: [0, 2] – > “0->2” [4, 5] – > “4->5” [7, 7] – > “7”
提示: 0 <= nums.length <= 20 -2^31 <= nums[i] <= 2^31 - 1 nums 中的所有值都 互不相同 nums 按升序排列
我们的思路是,使用双指针维护这个有序的区间,low维护这个区间的较小值,high维护这个区间的较大值;这里需要返回一个指向数组的数组指针,所以先开辟一个数组指针p,里面存放常量字符串,返回的长度先定义为0;这里使用sprintf函数将格式化数据写入字符串;注意这里,开辟一个空间,存放这个常量字符串的时候,因为这里输入的范围是-2^31到 2^31 - 1;
如:输入[-2147483648,-2147483647,2147483647]; 输出就是[“-2147483648->-2147483647”,“2147483647”],加上’ ’,所以每一个常量字符串要开辟25个字节
代码语言:javascript复制 char** summaryRanges(int* nums, int numsSize, int* returnSize)
{
char** p = (char**)malloc(sizeof(char*) * numsSize);
*returnSize = 0;
int i = 0;
while (i < numsSize)
{
//每次进来更新low,把当前i的值赋给low,i再
int low = i ;
//因为i 完,所以要判断i是否小于numsSize
//并且判断i现在所在的下标代表的元素是否是前一项 1,即判断是否有序
//若有序,i往后走,直到不有序
while (i < numsSize && nums[i] == nums[i - 1] 1)
{
i ;
}
//到这里就代表不有序了,但是i 完,所以有序的区间是low到i-1
//所以将i-1赋给high,使用low和high维护这个区间
int high = i - 1;
//开辟一个空间,存放这个常量字符串
//因为这里输入的范围是-2^31到 2^31 - 1,如:输入[-2147483648,-2147483647,2147483647]
//输出就是["-2147483648->-2147483647","2147483647"],加上'