快手面试算法题合集

本文汇总了快手面试中出现的算法题目,包括最长不重复序列、双栈实现队列、全排列、先序遍历、树的层次遍历等,并提供了相关问题的解题思路和代码实现,旨在帮助面试者提升算法能力。
摘要由CSDN通过智能技术生成

1.力扣原题:最长不重复序列

import java.util.*;
public class kuaishou {
    public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    String s=in.nextLine();
    System.out.println(longestPalindrome(s));
    }
    public static String longestPalindrome(String s){
        if(s==null ||s.length()==0){
            return "";
        }
        int[] range=new int[2];
        char[] str=s.toCharArray();
        for(int i=0;i<s.length();i++){
            i=findLongest(str,i,range);
        }
        return s.substring(range[0],range[1]+1);
    }
    public static int findLongest(char[] str,int low,int[] range){
        //查找中间部分
        int high=low;
        while(high<str.length-1 &&str[high+1]==str[low]){
            low--;
            high++;
        }
        int ans=high;
        //从z中间向左右扩散
        while(low>0 &&high<str.length-1 &&str[low-1]==str[high+1]){
            low--;
            high++;
        }
        if(high-low>range[1]-range[0]){
            range[0]=low;
            range[1]=high;
        }
        return ans;
    }
}

2.左边的数比它小,右边的数比它大

import java.util.*;
public class kuaishou {
    public static void main(String[] args){
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    sc.nextLine();
    int[] array=new int[n];
    int index=0;
    while(index<n){
        array[index]=sc.nextInt();
        index++;
    }
    int[] mos=new int[n];
    findMiddle(array,mos);
        for (int i = 0; i < array.length; i++) {
            if (mos[i] == 2) {
                System.out.print(array[i]);
                System.out.print(" ");
            }
        }
    }
    public static void findMiddle(int[] arr,int[] mos){
        if (null == arr || arr.length <= 2) {
            return;
        }
        int max = 0;
        int min = arr.length-1;
        for (int i = 0; i < arr.length; i++) {
            //max=arr[max]<=arr[i]?i:max;
            if(arr[max]<=arr[i]){
                max=i;
            }
            if (max == i) {
                mos[i]++;
            }
        }
        for (int i = arr.length-1; i >=0; i--) {
            //min=arr[min]>=arr[i]?i:min;
            if(arr[min]>=arr[i]){
                min=i;
            }
            if (min == i) {
                mos[i]++;
            }
        }
    }
}

用两个栈实现队列:力扣面试题09

class CQueue {
    LinkedList<Integer> stack1;
	LinkedList<Integer> stack2;

	public CQueue() {
		stack1 = new LinkedList<>();
		stack2 = new LinkedList<>();
	}

	public void appendTail(int value) {
		stack1.add(value);
	}

	public int deleteHead() {
		if (stack2.isEmpty()) {
			if (stack1.isEmpty()) return -1;
			while (!stack1.isEmpty()) {
				stack2.add(stack1.pop());
			}
			return stack2.pop();
		} else return stack2.pop();
	}
}

出现1的次数:力扣233

import java.util.*;
public class kuaishou {
    public static void main(String[] args){
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    System.out.println(count(n));
    }
    public static int count(int n){
        int base = 1;
        int count = 0;
        int weight = 0;
        int round = 0;
        int temp = n;
        while(temp>0){
            weight = temp%10;
            round = temp/10;
            temp = round;
            count += round*base;
            if(weight>1){
                count += base;
            }else if(weight == 1){
                count += n%base+1;
            }
            base = base*10;
        }
        return count;
    }
}

力扣1302:最深叶子结点的和

class Solution {
    public int deepestLeavesSum(TreeNode root) {
        if (root == null) return 0;
        
        int num = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            num = 0;
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                num += node.val;
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
        }
        return num;
    }
}

剑指offer:全排列

import java.util.ArrayList;
import java.util
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN和快手都是知名的科技公司,它们都运用了各种算法来优化自己的产品和服务。 首先,CSDN是一个技术社区和在线学习平台。为了提供更好的用户体验和推荐合适的学习资源,CSDN必然采用了基于用户行为和兴趣的个性化推荐算法。通过分析用户浏览记录、点击行为和收藏等数据,CSDN可以了解用户的兴趣和需求,进而向他们推荐相关性更高的文章和课程。此外,CSDN还利用机器学习和自然语言处理算法对文章进行标签分类和关键字提取,提高了搜索效果和文章匹配度。 快手是一个短视频社交平台,每天都有海量的用户上传、观看和分享视频。为了保证快手用户可以更快地找到感兴趣的内容,快手利用了多种算法来优化视频推荐。首先,快手通过协同过滤和内容相似度算法对用户的行为数据进行分析,了解用户的兴趣和喜好;其次,快手还应用了机器学习和图像识别算法,对视频进行标签分类和场景识别,从而更精准地为用户推荐相关的视频内容;此外,快手还运用了推荐算法来提高热门视频的曝光度,增加用户的观看和分享率。 总的来说,CSDN和快手都经过不断实践和优化,采用了各种算法来提升用户体验和产品质量。无论是个性化推荐、搜索引擎优化、内容分类还是视频推荐,这些算法都发挥了重要的作用,使得用户可以更方便地获得自己感兴趣的内容,提高了整体用户满意度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值