目录
一.比较含退格的字符串
题目描述:
给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:s = "ab#c", t = "ad#c" 输出:true 解释:s 和 t 都会变成 "ac"。
示例 2:
输入:s = "ab##", t = "c#d#" 输出:true 解释:s 和 t 都会变成 ""。
示例 3:
输入:s = "a#c", t = "b" 输出:false 解释:s 会变成 "c",但 t 仍然是 "b"。
提示:
1 <= s.length, t.length <= 200
s
和t
只含有小写字母以及字符'#'
代码实现:
bool backspaceCompare(char* s, char* t) {
int len1=strlen(s),len2=strlen(t);
int x=0,y=0;
for(int i=0;i<len1;i++)
{
if(s[i]!='#')
{
s[x]=s[i];
x++;
}
else
{
if(x>0)
{
x--;
}
}
}
s[x]='\0';
for(int j=0;j<len2;j++)
{
if(t[j]!='#')
{
t[y]=t[j];
y++;
}
else
{
if(y>0)
{
y--;
}
}
}
t[y]='\0';
return strcmp(s,t)==0;
}
解题思路:
1.首先计算出两条字符串的长的len1,len2作为跳出循环的条件。
2.创建整形变量x,并赋值为零,在循环中判断当前字符是否为#,若是则令x--,当然,此时的x必须满足大于0的条件,因为x是新的字符串的当前下标,判断当前字符不为#时就将当前字符赋值给下标为x的位置,并将x++。出循环后给x的当前位置赋值为'\0',表示字符串结束。
3.对于第二个字符串的处理方法与上面的相同。
4.返回字符串s,t判断是否相同的语句。
二.二分查找
题目描述:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
输入:nums
= [-1,0,3,5,9,12],target
= 9 输出: 4 解释: 9 出现在nums
中并且下标为 4
示例 2:
输入:nums
= [-1,0,3,5,9,12],target
= 2 输出: -1 解释: 2 不存在nums
中因此返回 -1
提示:
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
方法一
代码实现:
int search(int* nums, int numsSize, int target) {
//int x=0;
for(int i=0;i<numsSize;i++)
{
if(target==nums[i])
{
return i;
}
}
return -1;
}
解题思路:
从数组中第一个元素开始逐个判断,若与目标值相等则直接返回当前元素的数组下标,当数组循环完毕跳出循环时,说明数组中无目标元素,返回-1.
方法二
代码实现:
int search(int* nums, int numsSize, int target) {
int left=0,right=numsSize-1;
while(left<=right)
{
int mid=(right+left)/2;
if(nums[mid]==target)
{
return mid;
}
else if(nums[mid]<target)
{
left=mid+1;
}
else
{
right=mid-1;
}
}
return -1;
}
解题思路:
主要方法:二分查找法
首先设置数组最左边元素下标为left,最右边下标元素为right,当最左边下标小于等于最右边下标时进入循环,找出当前left和right的中间值mid,判断数组下标为mid的元素与目标元素是否相等,相等则返回mid,小于则将mid+1赋值给left,改变查找范围的左边界,大于则将mid-1的值赋值给right,改变查找的右边界,继续进行查找。
若未查找到目标元素则返回-1.