手刷算法day1(1)(go语言实践)

29. Divide Two Integers

 

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

 

解读题目:

给你两个字符串,用一个来匹配另外一个,如果他们是包含关系返回下表范围(从0开始),不包含则返回-1

 

知识点解读:

这个算法就有点类似正则表达式,不过正则表达式的算法特别复杂。

 

补充一个go语言的一个小知识点,字符串的底层是数组,实现结构被官方设计的时候写死了,为什么要写死?。。。所以面试的时候回为什么go语言的字符串不可以修改?

Go中的字符串的数据结构体是由一个指针和长度组成的结构体,该指针指向的一个切片才是真正的字符串值

 

个人猜想,当遇到一个非常长的字符时,这样做使得string变得非常轻量,可以很方便的进行传递而不用担心内存拷贝。虽然在Go中,不管是引用类型还是值类型参数传递都是值传递。但指针明显比值传递更节省内存。还有一点就是避免线程安全事故。

 

解题思路:(归类:暴力for匹配)

遍历给定字符串字符,判断以当前字符开头字符串是否等于目标字符串

 

代码实现如下

func strStr(haystack string, needle string) int {  
//判断needle字符串长度是不是空,为空直接返回0
  
  if len(needle)==0{
    return 0
    }
  //定义两个指针
  var i , j int
  //外循环,这里为什么要+1呢?防止两个字符串长度一样就不遍历了
  for i=0;i<len(haystack)-len(needle)+1;i++{
    //内循环,遍历目标数组
    for j=0;j<len(needle);j++{
//把内外遍历到的内容进行比较
      if haystack[i+j]!=needle[j]{
        //值不等就跳出内循环
        break
      }
        //此时只有j的累加数等于len(needle),他们才是包含关系
        if len(needle)==j{
          return i
         }
     }

}
//两层遍历结束,说明不包含,返回-1
return -1 }

 

posted @ 2023-03-04 17:04  像素飞行员  阅读(19)  评论(0)    收藏  举报