0
点赞
收藏
分享

微信扫一扫

[剑指OFFER快速练习]1-3打卡

fbd4ffd0717b 2022-03-25 阅读 75

1 把二叉树打印成多行

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路

  • 根节点入队
  • 如果队列不空,进行下面操作
  • 弹出一个节点所谓当前的根节点
  • 如果根节点有左孩子则访问左孩子并将左孩子入队
  • 如果根节点有右孩子,访问右孩子并将右孩子入队

代码实现

  • c++版本

[剑指OFFER快速练习]1-3打卡_丑数

  • java版本

[剑指OFFER快速练习]1-3打卡_丑数_02

  • python版本

[剑指OFFER快速练习]1-3打卡_c++_03

打卡

2020年7月8日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。

2 丑数

今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

思路----Py

顺序将每个丑数都放在数组里面,然后求解下一个丑数

  • 求解的丑数中,下一个丑数一定是由最小的丑数*2/3/5得来
  • 在数组中必定有一个丑数X2, 在它之前的数 * 2 都小于当前最大丑数, 在它之后的数 * 2都大于当前最大丑数, 同样有M3, M5

代码实现

  • c++版本
class Solution {
public:
int GetUglyNumber_Solution(int index) {
//动态规划,对于第i个数,它一定是之前已存在数的2倍,3倍或5倍
if(index <= 0)
return 0;
int* buf = new int[index];
buf[0] = 1;
int s1 = 0;
int s2 = 0;
int s3 = 0;
for(int i = 1;i<index;++i){
buf[i] = min(buf[s1]*2,min(buf[s2]*3,buf[s3]*5));
if(buf[i] == buf[s1]*2) s1++;
if(buf[i] == buf[s2]*3) s2++;
if(buf[i] == buf[s3]*5) s3++;
}
return buf[index-1];
}
};
  • java版本
import java.util.*;
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index<=0)return 0;
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(1);
int i2=0,i3=0,i5=0;
while(list.size()<index)//循环的条件
{
int m2=list.get(i2)*2;
int m3=list.get(i3)*3;
int m5=list.get(i5)*5;
int min=Math.min(m2,Math.min(m3,m5));
list.add(min);
if(min==m2)i2++;
if(min==m3)i3++;
if(min==m5)i5++;
}
return list.get(list.size()-1);
}
}
  • python版本
# -*- coding:utf-8 -*-
class Solution:
def GetUglyNumber_Solution(self, index):
if index < 1:
return 0

result = [1]
# 初始化
t2 = t3 = t5 = 0

nextIdx = 1
while nextIdx < index:
#当前最小值
minNum = min(result[t2] * 2, result[t3] * 3, result[t5] * 5)
result.append(minNum)

while result[t2] * 2 <= minNum:
t2 += 1
while result[t3] * 3 <= minNum:
t3 += 1
while result[t5] * 5 <= minNum:
t5 +=- 1

nextIdx += 1

return result[nextIdx - 1]

唠嗑

2020年7月21日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。

3 第一个只出现一次的字符

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

思路

  • 定义一个map<字符,个数>
  • 循环计算每个字符的个数
  • 遍历找出字符个数为1的即可

代码实现

  • c++版本

[剑指OFFER快速练习]1-3打卡_java_04

  • java版本

[剑指OFFER快速练习]1-3打卡_丑数_05

  • python版本

[剑指OFFER快速练习]1-3打卡_丑数_06

举报

相关推荐

0 条评论