题目一

原题链接 https://leetcode-cn.com/problems/two-sum/

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

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

示例:

给定 nums = [, , , ], target = 

因为 nums[] + nums[] =  +  =
所以返回 [, ]

提示:不能自身相加。

测试用例

[,,,]
预期结果
[,]

格式模板

public class Solution {
public int[] TwoSum(int[] nums, int target) {
    /*
    代码
    */
}
}

笔者的代码,仅供参考

使用暴力方法,运行时间 700ms-1100ms

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

运行时间 400ms-600ms

由于使用的是哈希表,所以缺点是键不能相同。

public class Solution {
public int[] TwoSum(int[] nums, int target) {
int[] a = new int[];
System.Collections.Hashtable hashtable = new System.Collections.Hashtable();
for(int i = ; i < nums.Length; i++)
{
hashtable.Add(nums[i], i);
}
for(int i = ; i < nums.Length; i++)
{
int complement = target - nums[i];
if (hashtable.ContainsKey(complement) && int.Parse(hashtable[complement].ToString())!=i)
{
a[] = i;
a[] = int.Parse(hashtable[complement].ToString());
}
}
return a;
}
}

还是哈希表,缺点是哈希表存储的类型是object,获取值时需要进行转换。

        public int[] TwoSum(int[] nums, int target)
{
int[] a = new int[];
System.Collections.Hashtable h = new System.Collections.Hashtable();
for (int i = ; i < nums.Length; i++)
{
int c = target - nums[i];
if (h.ContainsKey(c))
{
a[] = int.Parse(h[c].ToString()) <= nums[i] ? int.Parse(h[c].ToString()) : i;
a[] = int.Parse(h[c].ToString()) > nums[i] ? int.Parse(h[c].ToString()) : i;
}
else if (!h.ContainsKey(nums[i]))
{
h.Add(nums[i], i);
}
}
return a;
}

抄一下别人的

public class Solution
{
public int[] TwoSum(int[] nums, int target)
{
int[] res = {, };
int len = nums.Length;
Dictionary<int, int> dict = new Dictionary<int, int>();
for (int i = ; i < len; i++)
{
int query = target - nums[i];
if (dict.ContainsKey(query))
{
int min = (i <= dict[query]) ? i : dict[query];
int max = (i <= dict[query]) ? dict[query] : i;
return new int[] { min, max };
}
else if (!dict.ContainsKey(nums[i]))
{
dict.Add(nums[i], i);
}
} return res;
}
}
---------------------
作者:Bruce-Yeung
来源:CSDN
原文:https://blog.csdn.net/lzuacm/article/details/80551669
版权声明:本文为博主原创文章,转载请附上博文链接!

题目二

原题地址https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出:
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 。

示例 2:

输入: "bbbbb"
输出:
解释: 因为无重复字符的最长子串是 "b",所以其长度为 。

示例 3:

输入: "pwwkew"
输出:
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 。

要注意字符串为空、变量为null、字符串长度 Length = 1 等情况。

测试实例

输入
" "
"au"
"abcabcbb"
"bbbbb"
"pwwkew"
"aab" 预期结果分别是 1,2,3,1,3,2

代码格式模板

public class Solution {
public int LengthOfLongestSubstring(string s) { }
}

笔者的代码仅供参考

使用最笨的方式,200ms左右

public class Solution {
public int LengthOfLongestSubstring(string s) {
if (s == null || s == "")
return ; char[] a = s.ToCharArray(); //字符串转为字符数组
int start = ; //区间开始位置
int stop = ; //区间结束位置
int newMax = ; //当前区间数
int max = ; //区间最大个数 for (stop = ; stop < a.Length; stop++) //每次向后移动一位
{
bool b = false; //是否存在重复
for (int i = start; i < stop; i++) //检查当前元素在区间是否有相同值
{
if (a[stop] == a[i]) //如果stop+1位在区间找到相同的字符
{
char ls = a[stop];
if (newMax > max) max = newMax;
start = i + ; //区间开始位置重置
newMax = stop - start + ;
b = true;
break;
}
}
if (b == false)
newMax += ;
}
if (newMax > max) max = newMax;
return max;
}
}

完整测试代码(控制台)

using System;

namespace ConsoleApp1
{
public class Testa
{
public int LengthOfLongestSubstring(string s)
{
if (s == null || s == "")
return ; char[] a = s.ToCharArray(); //字符串转为字符数组
int start = ; //区间开始位置
int stop = ; //区间结束位置
int newMax = ; //当前区间数
int max = ; //区间最大个数 for (stop = ; stop < a.Length; stop++) //每次向后移动一位
{
bool b = false; //是否存在重复
for (int i = start; i < stop; i++) //检查当前元素在区间是否有相同值
{
if (a[stop] == a[i]) //如果stop+1位在区间找到相同的字符
{
char ls = a[stop];
if (newMax > max) max = newMax;
start = i + ; //区间开始位置重置
newMax = stop - start + ; //重新设置区间数
b = true;
break;
}
}
if (b == false) ////没有重新设置区间数时加1
newMax += ;
}
if (newMax > max) max = newMax;
return max;
}
}
class Program
{ static void Main(string[] args)
{
Testa t1 = new Testa(); //正确结果
Console.WriteLine(t1.LengthOfLongestSubstring(" ")); //
Console.WriteLine(t1.LengthOfLongestSubstring("au")); //
Console.WriteLine(t1.LengthOfLongestSubstring("abcabcbb")); //
Console.WriteLine(t1.LengthOfLongestSubstring("bbbbb")); //
Console.WriteLine(t1.LengthOfLongestSubstring("pwwkew")); //
Console.WriteLine(t1.LengthOfLongestSubstring("aab")); //
Console.ReadKey();
}
}
}

使用哈希集合,速度更快,100ms-150ms

        public int LengthOfLongestSubstring(string s)
{
int n = s.Length;
HashSet<char> set = new HashSet<char>(); //集合
int ans = , start = , stop = ; //ans为字符串长度,starp区间起点,stop区间终点
while (start < n && stop < n)
{
// try to extend the range [i, j]
if (!set.Contains(s[stop]))
{
set.Add(s[stop++]);
ans = Math.Max(ans, stop - start);
//或者ans = ans > (stop - start) ? ans : (stop - start)
}
else
{
set.Remove(s[start++]);
}
}
return ans;
}

完整控制台测试代码

using System;
using System.Collections.Generic;
using System.Linq; namespace ConsoleApp2
{
public class Solution
{
public int LengthOfLongestSubstring(string s)
{
int n = s.Length;
HashSet<char> set = new HashSet<char>(); //集合
int ans = , start = , stop = ; //ans为字符串长度,starp区间起点,stop区间终点
while (start < n && stop < n)
{
// try to extend the range [i, j]
if (!set.Contains(s[stop]))
{
set.Add(s[stop++]);
ans = Math.Max(ans, stop - start);
//或者ans = ans > (stop - start) ? ans : (stop - start)
}
else
{
set.Remove(s[start++]);
}
}
return ans;
}
}
class Program
{
static void Main(string[] args)
{ Solution t1 = new Solution(); //正确结果
Console.WriteLine(t1.LengthOfLongestSubstring(" ")); //
Console.WriteLine(t1.LengthOfLongestSubstring("au")); //
Console.WriteLine(t1.LengthOfLongestSubstring("abcabcbb")); //
Console.WriteLine(t1.LengthOfLongestSubstring("bbbbb")); //
Console.WriteLine(t1.LengthOfLongestSubstring("pwwkew")); //
Console.WriteLine(t1.LengthOfLongestSubstring("aab")); //
Console.ReadKey();
}
}
}

C# 算法题系列(一) 两数之和、无重复字符的最长子串的更多相关文章

  1. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  2. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  3. C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法

    题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...

  4. leetcode刷题第三天<无重复字符的最长子串>

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 : 输入: "abcabcbb" 输出: 解释: 因为无重复字符的最长子串是 . 示例 : 输入: &quo ...

  5. LeetCode刷题--无重复字符的最长子串(中等)

    题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...

  6. LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)

    LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...

  7. LeetCode 第三题--无重复字符的最长子串

    1. 题目 2.题目分析与思路 3.思路 1. 题目 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3 ...

  8. Java算法练习——无重复字符的最长子串

    题目链接 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &qu ...

  9. leetcode刷题3.无重复字符的最长子串

    题目:给定一个字符串,找出不含有重复字符的 最长子串 的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

随机推荐

  1. [PY3]——Queue

    Queue class Queue(builtins.object) __init__(self, maxsize=0) empty(self) full(self) get(self, block= ...

  2. 编写高质量JavaScript代码的68个有效方法

    简介: <Effective JavaScript:编写高质量JavaScript代码的68个有效方法>共分为7章,分别涵盖JavaScript的不同主题.第1章主要讲述最基本的主题,如版 ...

  3. Python jieba库的使用说明

    1.jieba库基本介绍 (1).jieba库概述 jieba是优秀的中文分词第三方库 - 中文文本需要通过分词获得单个的词语         - jieba是优秀的中文分词第三方库,需要额外安装 - ...

  4. mybatis使用拦截器显示sql,使用druid配置连接信息

    1.显示出sql内容: 新建2个类:MybatisInterceptor :拦截sql,并获得输出sql内容 package com.cpp.core.filter; import java.text ...

  5. nginx重启报错:nginx: [error] invalid PID number "" in "/run/nginx.pid"

    问题描述:执行 nginx -t 是OK的,然而在执行 nginx -s reload 的时候报错 nginx: [error] invalid PID number “” in “/run/ngin ...

  6. The type org.springframework.jms.JmsException cannot be resolved报错解决

    在调用JmsTemplate的send方法时,一直报编译时异常.如下: 异常提示是无法解析org.SpringFrawork.jms.JmsException类型.如下: The type org.s ...

  7. django(五):cookie和session

    一.Cookie 1.cookie机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确 ...

  8. 高并发第九弹:逃不掉的Map --> HashMap,TreeMap,ConcurrentHashMap

    平时大家都会经常使用到 Map,面试的时候又经常会遇到问Map的,其中主要就是 ConcurrentHashMap,在说ConcurrentHashMap.我们还是先看一下, 其他两个基础的 Map ...

  9. 不要在对抽象类接口abstract virtual什么的混淆不清了

    (最近带一个新手入门 讲这边老费力了.) 接口和抽象类不过都是类的抽象罢了,这是他们的本质,只不过人们的思维角度不同而已,一个偏向为行为契约上的抽象(接口) 一个更像大自然中的繁衍关系(抽象类). 直 ...

  10. python中类的约束和限制对象添加属性

    通过__slots__限制对象可添加的属性 class A: __slots__ = ['a', 'b'] pass a1 = A() a1.a = 10 print(a1.a) a1.c = 0 # ...