算法笔记(二)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/moon_goes/article/details/98469329

1.验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true

示例 2:
输入: “race a car”
输出: false

思路:把string转为char数组,双指针分别指向数组头尾,依次比较(Char.IsLetterOrDigit()方法解决空格、数字判断问题,ToLower()方法解决字母大小写不一致问题),一次遍历解决。代码如下:

public class Solution {
    public bool IsPalindrome(string s) {
        char[] ch=s.ToCharArray();
        int i=0;
        int j=ch.Length-1;
        while(i<j){
            if(!Char.IsLetterOrDigit(ch[i])) i++;
            else if(!Char.IsLetterOrDigit(ch[j])) j--;
            else if(Char.ToLower(ch[i])==Char.ToLower(ch[j])){
                i++;
                j--;
            }
            else return false;
        }
        return true;
    }
}

这个方法的执行效率有待提高。

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路:一开始使用暴力解法,直接用两层for循环遍历数组。之后补了一下哈希表的知识,哈希表的解法是创建一个hashtable,开始遍历数组,当遍历到nums[i]时,如果hashtable中存在一个数(设为temp),满足temp=target-nums[i],那么直接返回temp的下标和i;如果hashtable中不存在满足条件的temp,那么将nums[i]加入hashtable中。代码如下:

public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        Hashtable ht=new Hashtable();
        int i;
        for(i=0;i<nums.Length;i++){
            int temp=target-nums[i];
            if(ht.ContainsKey(temp)){
                return new int[]{(int)ht[temp],i};
            }
            if(!ht.ContainsKey(nums[i]))  ht.Add(nums[i],i);//注意如果hashtable中已有某个值,再加入会报错
        }
        return null;
    }
}

猜你喜欢

转载自blog.csdn.net/moon_goes/article/details/98469329