LeetCode代码汇总(二)

  • 1、同构字符串判断
// 获取每个字符串不同字母的索引位置判断是否相同
function isIsomorphic($s, $t) {
    $a = $this->getIndex($s);
    $b = $this->getIndex($t);
    return $a == $b;
}
function getIndex($s) {
    $res = [];
    for ($i = 0; $i < strlen($s); $i++)
    {
        $res[$s[$i]][] = $i;
    }
    return array_values($res);
}
// 输入: s = "egg", t = "add"
// 输出: true
  • 2、给定一个整数数组,判断是否存在重复元素。
function containsDuplicate($nums) {
    $map = [];
    for ($i = 0; $i < count($nums); $i++)
    {
        if (isset($map[$nums[$i]]))
        {
            return true;
        }
        else
        {
            $map[$nums[$i]] = 0;
        }
    }
}
  • 3、给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
// 采用位运算 & 来解决该问题
// 2 的 n 次幂可以表示为:2^0, 2^1, 2^2, 2^3……
// 如果我们将其转换为二进制表示为:1, 10, 100, 1000, 10000……
// 因此我们可以看到,如果一个数是 2 的 n 次幂,那么该数的二进制中就只含有一个 1
// n - 1的二进制为:1, 011, 0111, 01111……
// 所以 n 和 n - 1 进行 & 运算,为 0 则表示该数是 2 的 n 次幂
function isPowerOfTwo($n) {
    return ($n & ($n -1)) == 0;
}

同理在计算 3 的幂次方、4 的幂次方等时,同样可以使用此类方法,先将 n 转换为对应进制的数,判断转完之后的数字是否只含有一个 1

  • 4、给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。
// 统计每个字母出现次数进行比较
function isAnagram($s, $t) {
    $a = $this->getCount($s);
    $b = $this->getCount($t);
    if (count($a) != count($b)) return false;
    print_r($a);
    print_r($b);
    foreach ($a as $k => $v)
    {
        if (!isset($b[$k]) || $v != $b[$k])
        {
            return false;
        }
    }
    return true;
}
function getCount($s) {
    $map = [];
    for ($i = 0; $i < strlen($s); $i++)
    {
        if (isset($map[$s[$i]]))
        {
            $map[$s[$i]]++;
        }
        else
        {
            $map[$s[$i]] = 1;
        }
    }
    return $map;
}

//将两个字符串转数组排序后比较
function isAnagram($s, $t) {
    $a = asort(str_split($s));
    $b = asort(str_split($t));
    return $a == $b;
}
  • 5、给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
// 假设给定一个三位数 abc,可以表示为 100 * a + 10 * b + c
// 第一次计算后可以得到结果为 a+b+c,相比与原始值此次计算数值减小 99 * a + 9 * b = 9 * ( 11 * a + b),减少了 9 的整数倍
// 因此可以通过 abc 对 9 取余得到结果
function addDigits($num) {
    return $num % 9 == 0 ? 9 : $num % 9 ;
}
  • 6、编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须修改输入数组**、使用 O(1) 的额外空间解决这一问题。
// 从中间开始调换两侧元素
function reverseString(&$s) {
    if (count($s) % 2 == 0)
    {
        $right = count($s) / 2;
        $left = $right - 1;
    }
    else
    {
        $right = count($s) / 2 - 1;
        $left = count($s) / 2 + 1;
    }
    for ($i = count($s) / 2; $i < count($s); $i++)
    {
        $tmp = $s[$right];
        $s[$right] = $s[$left];
        $s[$left] = $tmp;
        $left--;
        $right++;
    }
}
  • 7、判断一个整数是否是完全平方数
// 二分查找
function isPerfectSquare($num) {
    $left = 1;
    $right = $num;
    while($left < $right)
    {
        $tmp = floor(($left + $right) / 2);
        if (pow($tmp, 2) == $num)
        {
            return true;
        }
        elseif (pow($tmp, 2) > $num)
        {
            $right = $tmp - 1;
        }
        else
        {
            $left = $tmp + 1;
        }
    }
    return false;
}
  • 8、判断丑数,丑数是只包含质因数 2, 3, 5 的正整数。
function isUgly($num) {
    while($num > 1)
    {
        if ($num % 2 == 0) $num = $num / 2;
        elseif ($num % 3 == 0) $num = $num / 3;
        elseif ($num % 5 == 0) $num = $num / 5;
        else return false;
    }
    return true;
}
  • 9、给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
// 利用位运算符异或
// 也可以通过求和
function missingNumber($nums) {
    $res = count($nums);
    for ($i = 0; $i <= count($nums); $i++)
    {
        $res = $res ^ $nums[$i];
    }
    return $res;
}
  • 10、给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
// 方法一:第一步删除数组中的 0 元素并记录个数,第二步在数组末尾补 0
function moveZeroes(&$nums) {
    $count = 0;
    for ($i = 0; $i < count($nums); $i++)
    {
        if ($nums[$i] == 0)
        {
            $count++;
            unset($nums[$i]);
        }
    }
    if ($count > 0)
    {
        for($i = 0; $i < $count; $i++)
        {
            array_push($nums, 0);
        }
    }
}
// 方法二:采用快排的思想,大于 0 的放在一个数组,小于 0 的放在一个数组,同样也可以采用冒泡的方式
function moveZeroes(&$nums) {
    $left = $right = [];
    for ($i = 0; $i < count($nums); $i++)
    {
        if ($nums[$i] > 0)
        {
            $right[] = $nums[$i];
        }
        else
        {
            $left[] = $nums[$i];
        }
    }
    $nums = array_merge($right, $left);
}
  • 11、给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
// map
function wordPattern($pattern, $str) {
    $map1 = $this->getMap($pattern, strlen($pattern));
    $arr = explode(" ", $str);
    $map2 = $this->getMap($arr, count($arr));
    return $map1 == $map2;
}
// 获取内容索引数组
function getMap($tmp, $len) {
    $map = [];
    for ($i = 0; $i < $len; $i++)
    {
        $map[$tmp[$i]][] = $i;
    }
    return array_values($map);
}
// 输入: pattern = "abba", str = "dog cat cat dog"
// 输出: true
  • 12、你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。每一步都是最优解。
// 此题困扰我好久,想过好几个办法,好像都没办法实现,最后没办法看了官方的题解,原来是一道找规律的题,找到规律只需一行代码
// 如果石头个数为:1、2、3,那么你一定能赢
// 如果石头个数为:4,那么无论你先拿几个石头都会输,因此可以发现如果在对方拿石头回合,石头个数为 4 是,那么对方一定会输
// 如果石头个数为:5、6、7,根据上一个条件,此次你可以拿1、2、3个石头,为对方留下 4 个,那么他一定输
// 如果石头个数为:8,此轮当你拿过石头后,剩余数量为 5、6、7 中的一个,此时对方拿完给你剩余 4 个石头,对方一定会赢
// 因此得出结论,如果石头个数为 4 的倍数,那么你就没有赢得可能
// 规律找的好,代码写得少
function canWinNim($n) {
    return $n % 4 != 0;
}
  • 13、给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。
// 相同字符异或后为 0
function findTheDifference($s, $t) {
    $res = $s . $t;
    $tmp = $res[0];
    for ($i = 1; $i < (strlen($s) + strlen($t)); $i++)
    {
        $tmp = $tmp ^ $res[$i];
    }
    return $tmp;
}
  • 14、给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
// 想要构成回文字符串,包含的字符必须是偶数个,最多有一个计数个的字母
// 第一步:计算字符串中不同字母的个数并存入数组
// 第二步:获取数组中最大的奇数,同时将数组中的奇数删除
// 第四步:计算数据 value 的和最大奇数的和即为结果
function longestPalindrome($s) {
    $map = [];
    for ($i = 0; $i < strlen($s); $i++)
    {
        if (isset($map[$s[$i]]))
        {
            $map[$s[$i]]++;
        }
        else
        {
            $map[$s[$i]] = 1;
        }
    }
    $max = 0;
    foreach ($map as $k => $val)
    {
        if ($val % 2 != 0)
        {
            $max = $val;
            unset($map[$k]);
        }
    }
    return array_sum($map) + $max;
}
  • 15、统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
// 英文字母的 ASCII 范围在 65~122 之间
function countSegments($s) {
    $count = 0;
    for ($i = 0; $i < strlen($s); $i++)
    {
        if (ord($s[$i]) < 65 || ord($s[$i]) > 122)
        {
            $count++;
        }
    }
    return $count;
}
  • 16、你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找出可形成完整阶梯行的总行数。
function arrangeCoins($n) {
    $sum = 1;
    $index = 1;
    while ($sum <= $n)
    {
        $index++;
        $sum += $index;
    }
    return $index - 1;
}
  • 17、给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。
// 首次遍历数组将数组内值放到对应位置上,然后遍历新的数组,不存在的索引即为结果
function findDisappearedNumbers($nums) {
    $arr = [];
    for ($i = 0; $i < count($nums); $i++)
    {
        $arr[$nums[$i]] = $nums[$i];
    }
    $res = [];
    for ($i = 1; $i <= count($nums); $i++)
    {
        if (!isset($arr[$i]))
        {
            $res[] = $i;
        }
    }
    return $res;
}
  • 18、给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
// 位运算,
function repeatedSubstringPattern($s) {
    if (strlen($s) % 2 != 0) return false;
    
    $res = $s[0];
    for ($i = 1; $i < strlen($s); $i++)
    {
        $res ^= $s[$i];
    }
    return $res == 0;
}
  • 19、给定一个二进制数组, 计算其中最大连续1的个数。
function findMaxConsecutiveOnes($nums) {
    $count = $max = 0;
    for ($i = 0; $i < count($nums); $i++)
    {
        if ($nums[$i] == 1)
        {
            $count++;
        }
        else
        {
            
            $max = max($count, $max);
            $count = 0;
        }
    }
    return $max;
}
  • 20、对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。
// 计算所有因子求和
function checkPerfectNumber($num) {
   $arr = [1];
   for ($i = 2; $i < sqrt($num); $i++)
   {
       if ($num % $i == 0)
       {
           $arr[] = $i;
           $arr[] = $num / $i;
       }
   }
   return array_sum($arr) == $num;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容