字节面试算法题

某个公司的一道题目
想瞅瞅代码
给定一个数n,如23121,给定一个数组,如2 4 9,求由数组元素组成的,小于23121的最大数为22999
数组和数n都是随机的
想问问怎么写
#字节##字节跳动##笔试题目#
全部评论
试探回溯法就行,找到所有数,选出小于n的最大数就行了,复杂度没提要求应该能过; public class Main { public static void main(String[] args) { int n=23121; int[] array=new int[] {2,4,9}; System.out.println(find(n, array)); }     public static int find(int n, int[] array) {      int depth=0;      List<Integer> list=new ArrayList<>();      int path=0;      char[] digits=Integer.toString(n).toCharArray();      dfs(n, depth, digits, array, path, list);      int result=0;      Collections.sort(list);      for(int i=0;i<list.size();i++) {      if(list.get(i)>=n) {      result=list.get(i-1);      break;      }      }      return result;     }          public static void dfs(int n, int depth, char[] digits, int[] array, int path, List<Integer> list) {      if(depth==digits.length) {      list.add(path);      return;      }      for (int i = 0; i < array.length; i++) { path = path * 10 + array[i]; dfs(n, depth + 1, digits, array, path, list); path = path / 10; } } }
1 回复 分享
发布于 2022-04-24 08:32
将数组排序 n转字符串 从左到右遍历n 对于每一位在数组中二分查找 如果位存在于数组中则选择并继续下一位 否则选择小于该位的最大值并且对与后面的位全部填充数组最大值
点赞 回复 分享
发布于 2022-04-24 08:14
字节一面遇到了,讲了模拟思路没写出来
点赞 回复 分享
发布于 2022-04-24 10:13
不用回溯,将给定的数组排序(理论上不用排序On时间复杂度),得到数组中的最大值和最小值。然后从给定数字的个位到高位遍历,直到找到第一个大于数组min的位。如果没有找到,答案就是原数字长度-1个数组最大值的拼接;如果找到了,找到那一位的更高位都不变,找到的那一位变成数组中小于它的最大值,然后比当前低的位用数组里面的最大值max替换即可。
点赞 回复 分享
发布于 2022-04-24 11:05
双指针可以考虑的
点赞 回复 分享
发布于 2022-04-28 10:30
#include<bits/stdc++.h> using namespace std; int main(){ int n=23121,m ; //cin>>n; vector<int>a={2,4,9},b,c; /*while(cin>>m){ a.push_back(m); }*/ sort(a.begin(),a.end()); while(n/10){ c.push_back(n%10); n/=10; } c.push_back(n); int target=0; for(int i=c.size()-1;i>=0;i--){ if(target==1){ b.push_back(a.back()); continue; } for(int j=0;j<a.size();j++){ if(c[i]==a[j]){ b.push_back(c[i]); break; } if(c[i]>a[j]){ b.push_back(a[j]); target=1; break; } } } int sum=0; for(int i =0;i<b.size();i++){ sum+=b[i]*pow(10,b.size()-i-1); } cout<<sum<<endl; }
点赞 回复 分享
发布于 2022-05-16 23:50

相关推荐

字节 Flow(豆包)推荐 总包N+15
点赞 评论 收藏
分享
02-06 15:19
河南大学 C++
勤奋搬砖的小牛马:不知道你有没有听过一个说法:C/C++不同方向有生殖隔离。 C/C++有很多细分方向(嵌入式,图形学,数据库内核,分布式存储,机器学习,等等),每个方向要学的东西都完全不一样。不像Java那种,不管哪个公司招人,要求的技术栈大差不差。 面试的时候,你要打动面试官对吧。大部分情况下面试官问的都是他比较熟悉的东西,一般就是他所在的公司做的方向的那套东西。这时候如果你简历上做的东西跟他熟悉的东西没有重叠,就很尴尬了。 你做的他根本看不懂,他只能问你一些基础八股。 假设你答得很好,他会对你有一个“基础很好但是没有XX方向相关经验”的印象,然后面评给你个65-70分。 假设你答得不好,或者他强行问你一些跟他做的方向相关,但你不懂的领域的东西(很多面试官都是这样),你基本就挂了。 如果你做的项目实际上很扎实,这就很亏,你根本没机会展示出你的优势,付出的努力也没转化为找工作的竞争力。 所以,现在当务之急是确定一个细分方向,然后去针对性准备相关知识和项目。 这里分两种情况。 1. 如果你实验室有一个C/C++相关的研究方向,并且这个方向比较火:一定利用好这个宝贵的优势多学习,多做项目,争取把实验室项目吃透,转化为你自己简历上的项目; 2. 其他情况:多查资料调研各个方向,决定方向以后,赶快找相关实习;或者自己找项目、lab做。目标也是在简历上有相关经验可以写; 简历有相关方向的实战项目,是关键中的关键! 同时其他方面需要准备: 1. 刷题 2. 语言基础知识 3. 操作系统 4. 网络 5. 细分方向知识 1如何准备:********面试经典150题,每天刷保持手感;没时间可以只刷简单和中等。 2-4如何准备:网上搜集面试常考的知识点,或者学习路线,然后到教材里划章节范围,看教材学。看教材的目的是有一个比较系统性的知识基础。学完再看看面经,看哪些地方是知识盲区,学之。可能有些知识(比如Linux某些特性)不在教材里,这些去网上找资料学。 5如何准备:领域知识的准备就比较灵活了。上面提到做项目的过程中,你应该已经陆陆续续学了一些。再多看看面经,针对常考的知识点查缺补漏。 再提一句,如果26年毕业,那今年就得参加秋招了。如果之前完全没准备过C/C++,估计来不及了。C/C++岗位相对较少,并且由于语言对研发能力要求高,所以能在里面卷的人一般能力都不差。这时候来卷C/C++要慎重,Java相对来说岗位多得多,准备难度也小一些。
点赞 评论 收藏
分享
评论
1
24
分享

创作者周榜

更多
牛客网
牛客企业服务