今天是学习LeetCode算法《算法入门》的14天,也是最后一天,中间发现了不少问题,后面会补充一下相关方面的知识储备,具体如下:
- 关于数据指针方面
- 数据结构 - 链表
- 动态规划方面(一直都对这个没什么概念😵😵😵)
- 位运算
[= 颠倒二进制位 =]
题目描述
解题思路
位运算本人就是个渣渣😭😭😭
另辟蹊径
1、将给定的int n 转为二进制 decbin()
2、在左侧补0直到32位
3、反转字符串 再转换为十进制 bindec()
解题方法
- PHP
function reverseBits($n) {
return (int) bindec(strrev(str_pad(decbin($n), 32, '0', STR_PAD_LEFT)));
}
- GO
// 此解法暂时还没有彻底搞明白😢😢😢
func reverseBits(num uint32) uint32 {
var ans uint32
for i:=0;i<32;i++{
ans=ans<<1|num&1 //逐步左移,复制最后一位给ans(&1 作用筛出num最后一位,前面高位设为0)
num=num>>1 //逐步右移,相当于删掉了最后一位(上步已处理)
}
return ans
}
【= 只出现一次的数字 =】
题目描述
解题思路
1、遍历数组
2、用map记录没有记录过的值, 如果有记录,删除map中的值
3、两两消去,只剩下出现一次的数
解题方法
- PHP
function singleNumber($nums) {
$map = [];
for($i=0;$i<count($nums); $i++) {
if(isset($map[$nums[$i]])) {
unset($map[$nums[$i]]);
}else {
$map[$nums[$i]] = $nums[$i];
}
}
return current($map);
}
- GO
func singleNumber(nums []int) int {
m := map[int]int{}
for i := 0; i < len(nums); i++ {
if _, ok := m[nums[i]]; ok {
m[nums[i]] += 1
} else {
m[nums[i]] = 1
}
}
res := 0
for k, v := range m {
if v == 1 {
res = k
}
}
return res
}