数据结构与算法之leetcode纯编程题

1.两数之和

public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        //析:在数组中找到两个数 他们的和=target  返回两数下标
        //注:每个数只可使用一次 即两数下标必须不同
        //1.本题可使用暴力求解双重循环遍历
        //2.可使用字典
        Dictionary<int, int> dic = new Dictionary<int, int>();
        for (int i = 0; i < nums.Length; i++)
        {
            if (dic.ContainsKey(nums[i]))
            {
                if (nums[i] * 2 == target)
                {
                    return new int[] { dic[nums[i]], i };
                }
            }
            else
            {
                dic.Add(nums[i], i);
            }
        }
        //所有元素添加至字典
        for (int i = 0; i < nums.Length; i++)
        {
            int value = target - nums[i];
            if (dic.ContainsKey(value) && dic[value] != i)
            {
                return new int[] { i, dic[value] };
            }
        }
                return new int[] { 0, 0 };
    }
}

1108.IP地址无效化

public class Solution {
    public string DefangIPaddr(string address)
    {
        //析:string不可修改  
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < address.Length; i++)
        {
            if (address[i] != '.')
            {
                stringBuilder.Append(address[i]);
            }
            else
            {
                stringBuilder.Append("[.]");
            }
        }
        return stringBuilder.ToString();
    }
}

344. 反转字符串

public class Solution {
    public void ReverseString(char[] s)
    {
        //析:char类型数组可原地对换修改
        int left = 0;
        int right = s.Length - 1;
        while (left < right)
        {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
            left++;
            right--;
        }
    }
}

剑指 Offer 58 - I. 翻转单词顺序

//方法一 使用API
public class Solution {
    public string ReverseWords(string s)
    {
        string[] str = s.Trim().Split(' ');
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = str.Length - 1; i >= 0; i--)
        {
            if (str[i] == "")
            {
                continue;
            }
            stringBuilder.Append(str[i] + ' ');
        }
        return stringBuilder.ToString().Trim();
    }
}
//方法二 自己实现
public class Solution {
public string ReverseWords(string s)
    {
        //这里是因为C#中的String不可变
        char[] str = s.ToCharArray();
        int n = trim(str);//自己实现的
        if (n == 0)
        {
            return "";
        }
        reverse(str, 0, n - 1);
        int p = 0;
        while (p < n)
        {
            int r = p;
            while (r < n && str[r] != ' ')
            {
                r++;
            }
            reverse(str, p, r - 1);
            p = r + 1;
        }
        //这里只是为了配合输出
        char[] newStr = new char[n];
        for (int i = 0; i < n; i++)
        {
            newStr[i] = str[i];
        }
        return new String(newStr);
    }
    /// <summary>
    /// 删除字符数组中前后 以及两单词之间的多余空格
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    private int trim(char[] str)
    {
        int i = 0;
        int k = 0;//去除空格后的数组下标
        int n = str.Length - 1;
        //去除前面的空格
        while (i <= n && str[i] == ' ')
        {
            i++;
        }
        //去除中间以及末尾的空格
        while (i <= n)
        {
            if (str[i] == ' ')
            {
                if (i + 1 <= n && str[i + 1] != ' ')
                {
                    str[k++] = ' ';
                }
            }
            else
            {
                str[k++] = str[i];
            }
            i++;
        }
        return k;
    }
    //返回[p,r]之间的字符串,注意这里是闭区间
    private void reverse(char[] str, int p, int r)
    {
        int left = p;
        int right = r;
        while (left < right)
        {
            char temp = str[left];
            str[left] = str[right];
            str[right] = temp;
            left++;
            right--;
        }
    }
}

125. 验证回文串

public class Solution {
    public bool IsPalindrome(string s)
    {
        int left = 0;
        int right = s.Length - 1;
        while (left < right)
        {
            while (left < right && !IsLetterOrNum(s[left]))
            {
                left++;
            }
            while (left < right && !IsLetterOrNum(s[right]))
            {
                right--;
            }
            if (toLower(s[left]) != toLower(s[right]))
            {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
    /// <summary>
    /// 判断当前字符是否是字母数字
    /// </summary>
    /// <param name="c"></param>
    /// <returns></returns>
    private bool IsLetterOrNum(char c)
    {
        if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
        {
            return true;
        }
        return false;
    }
    private char toLower(char c)
    {
        if (c >= 'a' && c <= 'z')
        {
            return c;
        }
        if (c >= '0' && c <= '9')
        {
            return c;
        }
        //大写A~Z 65-90  小写a~z 97-122
        return (char)((int)c + 32);
    }
}

9. 回文数

public class Solution {
    public bool IsPalindrome(int x) {
        //回文数 
        //判断特殊情况  1.负数一定不是回文数  2.x末尾为0一定不可能是回文数如(90 - 09)
        if (x < 0 || (x % 10 == 0 && x != 0))
        {
            return false;
        }
        //判断 121121是否是回文数  只需判断 121 == 121 
        int revernum = 0;
        while (revernum < x)
        {
            revernum = revernum * 10 + x % 10;
            x /= 10;
        }
        if (x == revernum || x == revernum / 10)
        {
            return true;
        }
        return false;
    }
}

58. 最后一个单词的长度

public class Solution {
    public int LengthOfLastWord(string s) {
        //去掉后置空格
        int n = s.Length;
        int i = n - 1;
        while (i >= 0 && s[i] == ' ')
        {
            i--;
        }
        if (i < 0) //字符串全是空格
        {
            return 0;
        }
        //遍历找到分割点空格,统计最后一个单词长度
        int length = 0;
        while (i >= 0 && s[i] != ' ')
        {
            length++;
            i--;
        }
        return length;
    }
}

剑指 Offer 05. 替换空格

public class Solution {
    public string ReplaceSpace(string s) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s.Length; i++)
        {
            if (s[i] == ' ')
            {
                stringBuilder.Append("%20");
            }
            else
            {
                stringBuilder.Append(s[i]);
            }
        }
        return stringBuilder.ToString();
    }
}

剑指 Offer 58 - II. 左旋转字符串

public class Solution {
    public string ReverseLeftWords(string s, int n) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = n; i < s.Length; i++)
        {
            stringBuilder.Append(s[i]);
        }
        for (int i = 0; i < n; i++)
        {
            stringBuilder.Append(s[i]);
        }
        return stringBuilder.ToString();
        }
}

26. 删除排序数组中的重复项

public class Solution {
    public int RemoveDuplicates(int[] nums) {
        //考虑特殊情况 
        if (nums.Length < 2)
        {
            return nums.Length;
        }
        int left = 0;
        int right = 1;
        while (right < nums.Length)
        {
            if (nums[left] != nums[right])
            {
                left++;
                nums[left] = nums[right];
            }
            right++;
        }
        return left + 1;
    }
}

剑指 Offer 67. 把字符串转换成整数

public class Solution {
    public int StrToInt(string str) {
                long value = 0;
        //去掉字符之前的空格
        String s = str.Trim();
        //判断特殊情况
        if (s.Length == 0)
        {
            return 0;
        }
        if (s[0] != '+' && s[0] != '-' && !(s[0] >= '0' && s[0] <= '9'))
        {
            return 0;
        }
        StringBuilder stringBuilder = new StringBuilder();
        //此时第一个符号为+ - 1-9
        for (int i = 0; i < s.Length; i++)
        {
            if (i == 0)
            {
                stringBuilder.Append(s[i]);
            }
            else
            {
                if (s[i] >= '0' && s[i] <= '9')
                {
                    stringBuilder.Append(s[i]);
                }
                else
                {
                    break;
                }
                //判断是否越界
                value = Convert.ToInt64(stringBuilder.ToString());
                if (value > Int32.MaxValue)
                {
                    return Int32.MaxValue;
                }
                else if (value < Int32.MinValue)
                {
                    return Int32.MinValue;
                }
            }
        }
        if (stringBuilder.Length == 1)
        {
            if (stringBuilder[0] == '+' || stringBuilder[0] == '-')
            {
                return 0;
            }
        }
        value = Convert.ToInt64(stringBuilder.ToString());
        return (int)value;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值