当前位置:网站首页>5月leetcode-C#刷题日志(持续更新中)

5月leetcode-C#刷题日志(持续更新中)

2022-08-11 05:30:00 黑白leo

5-22

1:删除排序数组中的重复项

升序排列的数组 nums ,原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持一致 。

tip1:原地删除

tip2:返回数组的新长度

tip3:为升序排列的数组

解题思路:

返回数组的长度,不能新创建数组,需要在原数组的基础上进行,因为给定的数组是升序排列的数组,一定程度上降低了难度,可采用双指针i和j来进行遍历比较操作

i从第0个位置开始,j从i+1的位置开始挨个比较,如果num[i]==num[j],j继续向后移动,直到num[i]!=num[j],然后将j的位置放在i+1即可

代码段如下:

public class Solution {
    public int RemoveDuplicates(int[] nums) 
    {
        if(nums==null|| nums.Length==0)
        return 0;
        int i=0 ;int j=1; int Le =nums.Length;
        while(j<Le)
        {
            if (nums[i] == nums[j]) j++;
            else if(nums[i] != nums[j])
            {
                nums[++i] = nums[j++];
            }
        }
        return i+1;
    }
}

2:买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润.

tip1:最多只能持有一只股票

tip2:一天内可以同时购买和抛售

tip3:求最大上升差

解题思路:

其实就是求价格变化过程中的最大上升差
我们以这一组价格来举例子[1,2,3,4,5],用折线图来看

 由图可以看出,我们最大的上升是4

因此就是比较今天和明天的价格差别,如果今天比明天低,就决定买入,如果今天比明天高,就再继续比较后面的价格,只要低就进行交易比较,最后把差相加即可

代码如下:

public class Solution {
    public int MaxProfit(int[] prices) 
    {
        if (prices.Length == 0)
        return 0;
        int max =0;
        for(int i=0;i<prices.Length-1;i++)
        {
            if(prices[i]<prices[i+1])
            {
                max=max+prices[i+1]-prices[i];
            }
        }
        return max;
    }
}

执行用时:100 ms, 在所有 C# 提交中击败了9.13%的用户

这样的运算速度不是特别快,可以考虑另一种优化算法:
把数组的长度用n表示,后面循环的时候可以直接从1开始

没有直接比较前后两天的大小,而是直接把大小写了出来,如果这个差值是大于0的,则最大值就把它加上,反之不管

public class Solution {
    public int MaxProfit(int[] prices) {
        int n = prices.Length;
        if (n <= 1) return 0;
        int max = 0;
        int d;
        for (int i = 1; i < n; i++) {
            d = prices[i] - prices[i-1];
            if (d > 0) max += d;
        }
        return max;
    }
}

执行用时:80 ms, 在所有 C# 提交中击败了81.97%的用户

内存消耗:38.5 MB, 在所有 C# 提交中击败了88.61%的用户

3:旋转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

第一种方法:

①取余,如果k比7小,返回k;如果k比7大,则以7为周期继续该循环

②数组的拷贝用法,Array.Copy(a,b,length)

第一个是原始数组开始拷贝的索引,第二个是目标数组开始的索引,第三个是需要拷贝的总长度

public class Solution {
    public void Rotate(int[] nums, int k) {
        k %= nums.Length;
        if (k < 1) return;
        for (int i = 0; i < k; i++)
        {
            var temp = nums[nums.Length - 1];
            Array.Copy(nums, 0, nums, 1, nums.Length - 1);
            nums[0] = temp;
        }
    }
}

不过这种方法死板,效率低,空间复杂度太高

第二种方法:

力扣

自定义reversal方法,1234567先全部反转,变成7654321,接着反转前k个,变成5674321,最后反转剩下的,变成5671234即可。

 (图片来源与leetcode,地址挂上面了)

①自定义reversal方法,三个重载,数组,开始和结束,即(int[] num , int start , int end)

②调用reversal方法,先反转全部,目标数组是num,从0开始,到最后一位结束;然后继续进行反转,直到变成目标顺序

public class Solution {
    public void Rotate(int[] nums, int k) {
        k %= nums.Length;
        if (k < 1) return;
        Reversal(nums, 0, nums.Length - 1);
        Reversal(nums, 0, k - 1);
        Reversal(nums, k, nums.Length - 1);
    }
    private void Reversal(int[] nums, int start, int end)
    {
        while (start < end)
        {
            var temp = nums[start];   
//第一次来说,start是0,end是6,把end和start交换,接着start++,end--,直到start = end为止
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}

暂时先写两种方法吧,累了

5-23

4:存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

第一种方法:双指针挨个比较,从第一位开始和所有元素比较,直到有相同元素,则返回为true,当遍历完所有元素,没有相同的,则返回false

public class Solution {
    public bool ContainsDuplicate(int[] nums) 
    {
        for(int i=0;i<nums.Length;i++)
        {
            for(int j=i+1;j<nums.Length;j++)
            {
                if(nums[i]==nums[j])
                return true;
            }
        }
        return false;
    }
}

但是运行效率不是很高,内存消耗比较大

第二种方法:我们可以先对数组进行排序,然后再比较。因为排序之后如果有相同的,那么相同的值肯定是挨着的,我们只需要在排序之后两两比较即可

public class Solution {
    public bool ContainsDuplicate(int[] nums) 
    {
        Array.Sort(nums);
        for(int i=1; i<nums.Length;i++)
        {
            if(nums[i]==nums[i-1])
            return true;
        }
        return false;
    }
}

运行效率比第一种要高一些

#看别人还有一种方法,设置set集合,因为set集合中的元素是不能有重复的,可以设置好直接比较set中的元素个数是否相同即可

5:只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

方法一:用异或运算来解决,有三个特点

a^a=0;  0^b=b;  异或运算满足交换律,所以对所有元素进行异或运算,最后剩下的就是该元素

  

public class Solution {
    public int SingleNumber(int[] nums) 
    {
        int res =0;
        for(int i=0; i<nums.Length;i++)
        {
            res^=nums[i];
        }
        return res;
    }
}

方法二:用hashset解决(此处采用了java)

public int singleNumber(int[] nums) {
    Set<Integer> set = new HashSet<>();
    for (int num : nums) {
        if (!set.add(num)) {
            //如果添加失败,说明这个值
            //在集合Set中存在,我们要
            //把他给移除掉
            set.remove(num);
        }
    }
    //最终集合Set中只有一个元素,我们直接返回
    return (int) set.toArray()[0];
}

6:两个数组的交集 II

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

解题思路:

step1:先进行排序,然后再挨个比较,先从第一个指针开始,比较第一个位置的

 它们是相同的,则把该值加入到集合中,然后指针继续进行比较

step2:指针同时继续向后移动,2的位置也是相同,继续向后,到了3和5,此时两个数是不同的,选取较小的数,指针向后移动一步,再进行比较,一直进行这样的操作,直到指针不再移动即可

 step3:此时又找到了两个相同的数字,继续同步移动指针

 step4:继续进行比较操作,最后一步到了9

 最后输出了1259.

代码如下:

public class Solution {
    public int[] Intersect(int[] nums1, int[] nums2) 
    {
        Array.Sort(nums1);
        Array.Sort(nums2);
        int i=0; int j=0;    
        var intersect = new List<int>(Math.Min(nums1.Length, nums2.Length));
        while (i < nums1.Length && j < nums2.Length)
        {
            if (nums1[i] < nums2[j])
            i++;
            else if(nums1[i] > nums2[j])
            j++;
            else
            {
                intersect.Add(nums1[i]);
                i++;
                j++;
            }
        }
        return intersect.ToArray();
    }
}

#此处的交集用了List,长度取了两个表中较小的一个,最后直接转换成Array即可。

7:加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

如果数组元素都是9,比如,9,99,999这种,数组长度会加一输出,其他的直接加一就好了

,用for循环遍历元素,如果不是9,直接加一,如果是9,该位置变为0,前面的位置加1

所以代码如下:

public class Solution {
    public int[] PlusOne(int[] digits) 
    {
        for(int i=digits.Length-1;i>=0;i--)
        if(digits[i]!=9)
        {
            digits[i]++;
            return digits;
        }
        else
        {
            digits[i]=0;  //该位变为0
        }
        int[] temp = new int[digits.Length+1];//当所有的元素都是9的时候,自然跳出来,重新创建数组,然后只需要把第一个位置变成1即可
        temp[0]=1;
        return temp;
    }
}

5-24

8:移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

解题思路:

方法一:构建一个数nor,将遍历出来非0的数依次放在数组的前面,而将剩下的元素都赋值为0即可

代码如下:

public class Solution {
    public void MoveZeroes(int[] nums) 
    {
        if(nums==null||nums.Length==0)
        {
            return;
        }
        int nor =0;     //构建一个新的从0开始的指针
        for(int i=0;i<nums.Length;i++)
        {
            if(nums[i]!=0)     //从第一位开始遍历非0数,并依次替换存储在新的指针里
            nums[nor++]=nums[i];
        }
        while(nor<nums.Length)  //遍历完了所有的非零数,剩下的位置均置零即可
        {
            nums[nor++]=0;      //这个nor++会继续从剩下的位置里面继续赋值
        }
    }
}

注意:nor++,表示赋值一次增加一,最后nums[nor++]=0;从赋值非0的最后一位继续往后,把0赋值给它

方法二:双指针

 此时i记录的是零的个数,我们把j - i当成一个指针,就相当于把0的位置和非0的位置调换位置,有相邻的0也是一样的操作

 

 最后输出的就是149000.

代码如下:

public class Solution 
{
    public void MoveZeroes(int[] nums) 
    {
        int i=0;
        for(int j=0;j<nums.Length;j++)
        if(nums[j]==0)
        {
            i++;
        }
        else if(i!=0)
        {
            nums[j-i]=nums[j];
            nums[j]=0;
        }
    }
}

9:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

第一种方法:直接两个for循环暴力求解,要返回两个下标的数组,所以后面要返回新数组

public class Solution 
{
    public int[] TwoSum(int[] nums, int target) 
    {
        for(int i=0;i<nums.Length-1;i++)
        {
            for(int j=i+1;j<nums.Length;j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    return new int[] {i,j};
                }
            }
        }
        return new int[]{-1, -1};
    }
}

当然新数组也可以提前声明,后面把元素添加进去就好了

public class Solution 
{
    public int[] TwoSum(int[] nums, int target) 
    {
        int[] ans = new int[2];
        for(int i=0;i<nums.Length-1;i++)
        {
            for(int j=i+1;j<nums.Length;j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    ans[0]=i;
                    ans[1]=j;
                }
            }
        }
        return ans;
    }
}

但是这种的貌似效率没前面的高

10:有效的数独(未完全消化)

请你判断一个 9 x 9 的数独是否有效。只需要根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

 

注意:

一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 ' . ' 表示。

解题思路:

方法一:构建三个二维数组,分别为行,列,3×3方块,分别判断里面有没有一致的元素即可,属于暴力求解,代码如下:
 

public class Solution {
    public bool IsValidSudoku(char[][] board) {
        int length = board.Length;             //长度命名一下
        int [,] line= new int[length,length];  //行的二维数组
        int [,] column = new int[length,length];  //列的二维数组
        int [,] cell = new int[length,length];    //3×3单元格的二维数组
        for (int i = 0; i < length; ++i)
            for (int j = 0; j < length; ++j) {
                if (board[i][j] == '.')             //如果还没有填数字,直接跳过
                    continue;
                
                int num = board[i][j] - '0' - 1;     //num是当前格子的数字
                int k = i / 3 * 3 + j / 3;  //k是第几个单元格,9宫格数独横着和竖着都是3个单元格
              
                //如果当前数字对应的行和列以及单元格,只要一个有数字,说明冲突了,直接返回false。
                //举个例子,如果line[i][num]不等于0,说明第i(i从0开始)行有num这个数字。
                if (line[i,num] != 0 || column[j,num] != 0 || cell[k,num] != 0)
                    return false;
                    
                //表示第i行有num这个数字,第j列有num这个数字,对应的单元格内也有num这个数字
                line[i,num] = column[j,num] = cell[k,num] = 1;
            }
        return true;
    }
}

注意:

① int num = board[i][j] - '0' - 1;//num是当前格子的数字

②//如果当前数字对应的行和列以及单元格,只要一个有数字,说明冲突了,直接返回false。
                //举个例子,如果line[i][num]不等于0,说明第i(i从0开始)行有num这个数字。
                if (line[i,num] != 0 || column[j,num] != 0 || cell[k,num] != 0)
                    return false;
                    
                //表示第i行有num这个数字,第j列有num这个数字,对应的单元格内也有num这个数字
                line[i,num] = column[j,num] = cell[k,num] = 1;

方法二:位运算解决,上面使用的是二维数组,实际上我们还可以使用一维数组,直接使用位运算来存储,因为一个int类型是32位,用它来表示9个数字足够了,代码如下:
 

public class Solution {
    public bool IsValidSudoku(char[][] board) {
        int[] line = new int[9];
        int[] column = new int[9];
        int[] cell = new int[9];
        int shift = 0;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] == '.')
                    continue;
                shift = 1 << (board[i][j] - '0');
                int k = (i / 3) * 3 + j / 3;
                //如果对应的位置只要有一个大于0,说明有冲突,直接返回false
                if ((column[i] & shift) > 0 || (line[j] & shift) > 0 || (cell[k] & shift) > 0)
                    return false;
                column[i] |= shift;
                line[j] |= shift;
                cell[k] |= shift;
            }
        }
        return true;
    }
}

注意:其实思路和上面是一样的,有些细节还需理解

① shift = 1 << (board[i][j] - '0');

②//如果对应的位置只要有一个大于0,说明有冲突,直接返回false
                if ((column[i] & shift) > 0 || (line[j] & shift) > 0 || (cell[k] & shift) > 0)
                    return false;
                column[i] |= shift;
                line[j] |= shift;
                cell[k] |= shift;

11:旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

方法一:一圈一圈的旋转

C#的代码实现如下:

public class Solution {
    public void Rotate(int[][] matrix) {
        for (int i = 0; i < matrix.Length / 2; i++)
        {
            var end = matrix.Length - 1 - i;
            for (var j = 0; j < end - i; j++)
            {
                int temp = matrix[i][i + j];
                matrix[i][i + j] = matrix[end - j][i];
                matrix[end - j][i] = matrix[end][end - j];
                matrix[end][end - j] = matrix[i + j][end];
                matrix[i + j][end] = temp;
            }
        }
    }
}

方法二:先上下交换,在对角线交换

5-25

12:反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

解题思路:

方法一:直接使用轮子,Reverse是字符串自带的方法

public class Solution {
    public void ReverseString(char[] s) 
    {
        Array.Reverse(s);
    }
}

方法二:对称交换方法,创建临时变量temp

public class Solution {
    public void ReverseString(char[] s) 
    {
        int l=s.Length;
        char temp;
        for(int i=0;i<l/2;i++)
        {
            temp = s[i];
            s[i] = s[l-1-i];
            s[l-1-i]=temp;
        }
    }
}

#也可以写个交换方法,代码如下:
 

public class Solution {
    public void ReverseString(char[] s) 
    {
        int length = s.Length;
        int left = 0;
        int right = length - 1;
        while (left < right) {
            swap(s, left++, right--);
        }
    }

    private void swap(char[] array, int i, int j) {
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

方法三:使用Reverse的底层方法,新建一个数组,然后让原串逆向输出给新数组


public SequencedString Reverse()
{
    int i;
    SequencedString newstr= new SequencedString(items.Length);
    for(i=this.Length-1;i>=0;i--)
    {
        newstr.Concat(this.items[i]);
    }
    return newstr;

不过这样就新建了数组,不符合题目要求了

方法四:递归反转

public class Solution {
    public void ReverseString(char[] s) 
    {
        if (s == null || s.Length == 0)
            return;
        reverseStringHelper(s, 0, s.Length - 1);//非空字符串则使用递归
    }

    public void reverseStringHelper(char[] s, int left, int right) 
    {
        if (left >= right)
            return;
        swap(s, left, right);   //确保右边比左边大
        reverseStringHelper(s, ++left, --right);
    }

    private void swap(char[] array, int i, int j) //交换方法不变
    {
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

13:整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

解题思路:

方法一:暴力操作,直接转换成char类型,利用我们的reverse方法

①如果数小于0,取个绝对值,然后把它转换成字符串格式的

②新建StringBuilder

C#基础类库中定义了两个串类:

类String和类StringBuilder。

String定义在System命名空间中,用于一般文本的表示,C#预设的关键字string类型和System.String类的简化的别名,他俩是一样的,string对象一旦创建就不能的修改。

C#库在System.Text,命名空间中还定义了一个字符串类StringBuilder,此类表示值为可变字符序列的对象,即StringBuilder类型的对象在创建后可通过追加、移除、替换或插入字符而修改。
③新建临时字符表,重载char

④遍历已经转化成功的字符串,然后挨个添加到这个临时表字符表中

⑤对该临时表进行反转操作

⑥然后再进行上面的反操作,把他转换显示转化成int类型,最后输出负值即可

⑦如果为正数,就少了第一步操作

代码如下:

public class Solution
    {
        public int Reverse(int x)
        {
            try
            {
                if (x < 0)
                {
                    x = -x;
                    string stringX = x.ToString();
                    StringBuilder sb = new StringBuilder();
                    List<char> tempX = new List<char>();
                    foreach (char c in stringX)
                    {
                        tempX.Add(c);
                    }
                    tempX.Reverse();
                    foreach(var c in tempX)
                    {
                        sb.Append(c);
                    }
                    int temp = Convert.ToInt32(sb.ToString());
                    return -temp;
                }
                else
                {
                    string stringX = x.ToString();
                    StringBuilder sb = new StringBuilder();
                    List<char> tempX = new List<char>();
                    foreach (char c in stringX)
                    {
 
                        tempX.Add(c);
                    }
 
                    tempX.Reverse();
                    foreach (char c in tempX)
                    {
                        sb.Append(c);
                    }
                    int temp = Convert.ToInt32(sb.ToString());
                    return temp;
                }
            }
            catch
            {
                return 0;
            }        
        }
    }

缺点:代码太多了

方法二:取余运算取出最后一个数字,具体步骤如下:

 具体的代码如下:

核心操作如下

// 弹出 x 的末尾数字 digit
digit = x % 10
x /= 10

// 将数字 digit 推入 rev 末尾
rev = rev * 10 + digit

完整代码如下:

public class Solution {
    public int Reverse(int x) 
    {
        int res = 0;
        while (x != 0) {
            int t = x % 10;
            int newRes = res * 10 + t;
            //如果数字溢出,直接返回0
            if ((newRes - t) / 10 != res)
                return 0;
            res = newRes;
            x = x / 10;
        }
        return res;
    }
}

注意:判断溢出的条件

if ((newRes - t) / 10 != res)

也可以直接把32的范围写上去

14:字符串中的第一个唯一字符

给定一个字符串 s ,找到它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

方法一:

遍历s中的元素,如果它第一次出现的索引和最后一次出现的索引是一致的,就返回它,如果没有,就返回-1;

public class Solution {
    public int FirstUniqChar(string s) 
    {
        for(int i=0;i<s.Length;i++)
        {
            if(s.LastIndexOf(s[i])==s.IndexOf(s[i]))
            return i;
        }
        return -1;
    }
}

方法二:

进行两次遍历,先统计每个字符出现的次数,第二遍再次从前往后遍历字符串s中的每个字符,如果某个字符出现一次直接返回,这里使用了字典来存储,代码如下:
 

public class Solution {
     public int FirstUniqChar(string s)
    {
        Dictionary<char,int> _dic = new Dictionary<char, int>();
        for (int n = 0; n < s.Length; n++)
        {
            if (!_dic.ContainsKey(s[n]))
            {
                _dic.Add(s[n],1);
            }
            else
            {
                _dic[s[n]]++;
            }
        }
 
        for (int i = 0; i < s.Length; i++)
        {
            if (_dic[s[i]] == 1)
                return i;
        }
        
        return -1;
    }
}

15:有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

解题思路:

第一种:把两个字符串转换成数组,然后对数组进行排序,然后找它们数组中一样的部分

public class Solution {
    public bool IsAnagram(string s, string t) 
    {
        if (s.Length != t.Length) 
            return false;
        char[] schar=s.ToCharArray();
        char[] tchar=s.ToCharArray();
        Array.Sort(schar);
        Array.Sort(tchar);
        return Array.Equals(schar,tchar);
    }
}

这种操作方法不行的,如果位置不一样就做不出来

PASS

第二种:使用哈希表来解决 
 

public class Solution {
    public bool IsAnagram(string s, string t) {
        if (s.Length != t.Length) return false;
        var dic = new int[26];
        for (int i = 0; i < s.Length; i++)
        {
            dic[s[i] - 97]++;
            dic[t[i] - 97]--;
        }
        for (int i = 0; i < 26; i++)
        {
            if (dic[i] != 0) return false;
        }
        return true;
    }
}

16:验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

解题思路:

class Solution {
    public bool isPalindrome(String s) {
        s = s.ToLowerCase();    // 转小写
        s = s.ReplaceAll("[\\W[_]]", "");   // 正则表达式,将符号替换为“”
        int a = s.Length() - 1; // 尾指针
        // 遍历长度的一半
        for(int i = 0; i < s.Length() / 2; i++) {
            if(s.CharAt(i) == s.CharAt(a)) {
                a--;
            } else {
                return false;
            }
        }
        return true;
    }
}

5-26

17:字符串转换整数 (atoi)

 

18:

19:

20:

5-27

5-28

5-29

5-30

5-31

原网站

版权声明
本文为[黑白leo]所创,转载请带上原文链接,感谢
https://blog.csdn.net/leikang111/article/details/124913061