十五年等待候鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制造染料和布匹

admin 2天前 ( 11-23 22:37 ) 0条评论
摘要: 为什么建议程序员一定要进大厂?那年十八 母校舞会 站着如喽罗那时候 我含泪 发誓各位 必须看到我第一题:从1到n整数中1出现的次数求出1~13的整数中 1 出现的次数,并算出 10...

为什么主张程序员一定要进大厂?

那年十八 母校舞会 站着如头目

那时候 我含泪 立誓各位 有必要看到我

第一题:从1到n整数中1呈现的次数

求出1~13的整数中 1 呈现的次数,并算出 100~1300 的整数中1呈现的次数?为此他特别数了一下 1~13 中sexygay包括1的数字有 1、10、11、12、13 因而共呈现 6 次,可是关于后边问题他就没辙了。ACMer 期望你们帮帮他,并把问题愈加普遍化,能够很快的求出恣意非负整数区间中1呈现的次数(从1 到 n 中1呈现的次数)。

解题思路

  1. 假定$$n=21345$$将数字分为首位和非首位两个部分
  2. 关于首位为 1 的状况,假如首位$$>1$$那么$$sum=sum+10^{len(n)-1}$$,假如首位$$=1$$那么 $$sum=sum+1$$
  3. 关于非首位 1,指定其间一位为 1,依据排列组合有 $$10^{len(n)-2}\times(len(n)-1)$$个。那么非首位 1 总共有 $$2\times10^{len(n)-2}\times(len(n)-1)$$
public int NumberOf1Between1AndN_Solution(int n) {
int[] re十五年等候留鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制作染料和布疋s = {0};
NumberOf1Between1AndN(res, n);
return res[0];
}
private void NumberOf1Between1AndN(int[] res, int n) {
//假定 num=21345
String num = String.valueOf(n);
int firstNum = num.charAt(0) - '0';
if (num.length() == 1) {
if (firstNum > 0) res[0]++;
return;
}
String nextNum = num.substring(1);
int nextN = Integer.valueOf(nextNum);
//数字 10000 ~ 19999 的第一位中的个数
if (firstNum > 1) {
res[0] += Math.pow(10, num.length() - 1);
} else if (firstNum == 1割掉腋下汗腺会留疤吗) {
res[0] += nextN + 1;
}
//1346 ~ 21345 除第一位之外的数的个数
res[0] += firstNum * (num.length() - 1) * Math.pow(10, num.length() - 2);
NumberOf1Between1AndN(res, nextN);
}

第二题:把数组排成最小的数

全pk10三军免费计划输入一个正整数数组,把数组里一切数字拼接起来排成一个数,打印能拼接出的一切数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

解题思路

  1. 最直接的方法便是,找到数组中数字的一切排列组合,找到最小的
  2. 关于$$m,n$$,能够组成$$mn,nm$$这两个数,假如$$mn < nm$$那么,$$m$$应该在$$n$$之前
  3. 关于一组数,能够经过上述规矩进行排序,顺次打印出来便是最小的数
  4. 由于组合之后的数或许超出 int 的表明规模,留意运用字符串来处理大数问题
public String PrintMinNumber(int[] numbers) {
List nums = new ArrayList<>();
for (int number : numbers) {
nums.add(String.valueOf(number));
}
nums.sort(Comparator.comparing(s -> s, (o1, o2) -> (o1 + o2).compareTo(o2 + o1)));
StringJoiner joiner = new StringJoiner("");
nums.forEach(joiner::add);
return joiner.toString();
}

第三题:丑数

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

解题思路

  1. 经过保存已有丑数的方法,用空间换时刻
  2. 关于已有丑数$$M$$,那么下一个丑数 $$M=\min(M{2}\times2,M{3}\times3,M_{5}\times5)$$
  3. 3.$$M{max}$$ 是现在最大的丑数,那么$$M{2}$$是已有丑数中$$M{2}\times2$$第一个大于$$M{max契约驸马}$$的丑数
public int GetUglyNumber_Solution(int index) {
if (index == 0) {
return 0;
}
if (index == 1) {
return 1;
}
ArrayList list = new ArrayList<>(index);
list.add(1);
int preIndex2 = 0;
int pre十五年等候留鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制作染料和布疋Index3 = 0;
int preIndex5 = 0;
for (int i = 0; i < index; i++) {
int next2 = list.get(preIndex2) * 2;
int next3 = list.get(preIndex3) * 3;
int next5 = list.get(preIndex5) * 5;
int nextV = Math.min(Math.min(next2, next3), next5);
list.add(nextV);
while (preIndex2 < list.size() - 1 && list.get(preIndex2) * 2 <= nextV) preIndex2++;
while (preIndex3 < list.size() - 1 && list.get(preIndex3) * 3 <= nextV) preIndex3++;
while (preIndex5 < list.size() - 1 && list.get(preIndex5) * 5 <= nextV) preIndex5++;
}
return list.get(index - 1);
}

第四题:第一个只呈现一次的字符

在一个字符串(0<=字符串长度<=10000,悉数由字母组成)中找到第一个只呈现一次的字符,并回来它的方位, 假如没有则回来 -1(需求区别大小写).

解题思路

  1. 经过 LinkedHashMap 记载数组次序,然后核算字符呈现的次数
  2. 遍历找到第一个只呈现 1次 的字符
public int FirstNotRepeatingchar(String str) {
LinkedHashMap data 小菊的冬季= new LinkedHashMap<>();
char[] chars = str.toCharArray();
for (char c : chars) {
Integer count = data.getOrDefault(c, 0);
data.put(c, count + 1);
}
Character res = null;
for (Character c : data.keySet()) {
if (data.get(c) == 1) {
res = c;
break;
}
}
if (res == null) {
return -1;
}
for (int i = 0; i < chars.length; i++) {
if (chars[i] == res) {
return i;
}
}
return -1;
}

第五题:数组中的逆序对

全pk10三军免费计划在数组中的两个数字,假如5l密炼机前面一个数字大于后边的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的成果输出。 即输出P%1000000007

输入描绘: 标题确保输入的数组中没有的相同的数字

数据规模

 关于%50的数据,size<=10^4
关于%75的数据,size<=10^5
关于%100的数据,size<=2*10^5

解题思路

  1. 运用归并排序的方法,划分子数组
  2. 两个子数组进行比照,有两个别离指向两个数组结尾的指针 f,s,数组切割下标为 mid,假如 array[f] > array[s]那么,就有s - mid个 array[f] 的逆序
  3. 依此类推,最终将数组排序,而且取得成果
public int InversePairs(int[] array) {
long[] sum = {0};
if (array == null 马小乐|| array.length == 0) {
return (int) sum[0];
}
int[] temp = new int[array.length];
mergeSort(array, 0, array.length - 1, temp, sum);
return (int燕池个人简介) (sum[0] % 1000000007);
}
private void mergeSort(int[] array, int start, int end, int[] temp, long[] sum) {
if (start == end) {
return;
}
int mid = (start + end) / 2;
mergeSort(array, start, mid, temp, sum);
mergeSort(array, mid + 1, end, temp, sum);
int f = mid, s = end;
int t = end;
while (f >= start && s >= mid + 1) {
if (array[f] > array[s]) {
temp[t--] = array[f--];
sum[0] += s - mid;
} else {
temp[t--] = array[s--];
}
}
while (f >= start) {
temp[t--] = array[f--];
}
while (s >= mid + 1) {
temp[t--] = array[s--];
}
for (int i = end, j = end; i >= start; ) {
array[j--] = temp[i--];
}
}

第六题:两个链表的第一个公共结点

全pk10三军免费计划输入两个链表,找出它们的第一个公共结点。

处理思路

空间复杂度 O(n) 的算法

  1. 运用辅佐容器,保存第一个链表的一切元素
  2. 遍历第二个链表,并比照当时节点是否在辅佐容器中
/**
* 空间 O(n)
*
* @param pHead1
* @param pHead2
* @return
*/
public ListNode FindFirstCommonNode_1(ListNode pHead1, ListNode pHead2) {
Set node1s = new HashSet<>();
while (pHead1 != null) {
node1s.add(pHead1);
pHead1 = pHead1.next;
}
while (pHead2 != null) {
if (node1s.contains(pHead2)) {
return pHead2;
}
pHead2 = pHead2.next;
}
return null;
}

空间复杂度 O(1) 的算法

  1. 由于两个链表有或许不一样长,首要经过遍历找到他们的长度
  2. 移动较长的那个链表,使得两个链表长度共同
  3. 同步遍历两个链表

原理:假如两个链表相交,那么它们一定有相同的尾节点

/**
* 空间 O(1)
*
* @param pHead1
* @param pHead2
* @return
*/
public ListNode FindFirstCommonNode_2(ListNode pHead1, ListNode pHead2) {
int len1 = 0, len2 = 0;
ListNode cursor1 = pHead1, cursor2 = pHead2;
while (cursor1 != null) {
cursor1 = cursor1.next;
len1++;
}
while (cursor2 != null) {
cursor2 = cursor2.next;
len2++;
}
cursor1 = pHead1;
cursor2 = pHead2;
if (len1 > len2) {
int i = len1;
while (i != len2) {
cursor1 = cursor1.next;
i--;
}
} else if (len1 < len2) {
int i = len2;
while (i != len1) {
cursor2 = cursor2.next;
i--;
}
}
while (cursor1 != null && cursor2 != null) {
if (cursor1 == cursor2) {
return cursor1;
}
cursor1 = cursor1.next;
cursor2 = cursor2.next;
}
return null;
}

第七题:数字在排序数组中呈现的次数

全pk10三军免费计划核算一个数字在排序数组中呈现的次数。

解题思路

  1. 运用二分查找,找到恣意一个 k
  2. 由于 k 有多个,而且当时找到的 k 或许在恣意方位。所以,在当时 k 的前后进行遍历查找
public int GetNumberOfK(int[] array, int k) {
if (array == null || array.length == 0) {
return 0;
}
//二分查找
int start = 0, end = array.length - 1;
int t = -1;
while (start < end) {
int mid = (start + end) / 2;
if (array[mid] == k) {
t = mid;
break;
} else if (array[mid] > k) {
end = mid - 1;
} else {
start = mid + 1;
}
}
if (array[start] == k) {
t = start;
}
if (t == -1) {
return 0;
}
//左边
int sum = 0;
int a = t;
while (a >= 0 && array[a] == k) {
sum++;
a--;
}
//右侧
a = t + 1;
while (a < array.length && array[a] == k) {
sum++;
a++;
}
return sum;
}

第八题:二叉树的深度

全pk10三军免费计划输入一棵二叉树,求该树的深度。从根结点到叶结点顺次经过的结点(含根、叶结点)构成树的一条途径,最长途径的长度为树的深度。

解题思路

  1. 深度优先遍历
public int TreeDepth(TreeNode root) {
int[] max = {0};
depth(root, max, 1);
return max[0];
}
private void depth(TreeNode root, int[] max, int curDepth) {
if (root == null) return;
if (curDepth > max[0]) max[0] = curDepth;
depth(root.left, max, curDepth + 1);
depth(root.right, max, curDepth + 1);
}

第九题:数组中只呈现一次的数字

全pk10三军免费计划一个整型数组里除了两个数字之外,其他的数字都呈现了两次。请写程序找出这两个只呈现一次的数字。

解题思路

  1. 两个持平的数字进行异或的成果为0
  2. 在这个特别的数组中,重复呈现的数字只能为2次,那么假如将一切数字异或 就等价与将两个不同的数字进行异或
  3. 异或的成果必定有一位为1,那么这两个不同的数字韦昭尤风水解说全集,在这一位上不同。
  4. 找到第一个为1的位,并将第一位为1的位是否为1作为分组条件,相同的数字一定在同一个分组里,整个数组分组异或
  5. 得到两个成果,即为两个不同的数
/**
* num1,num2别离为长度为1的数组。传出参数。将num1[0],num2[0]设置为回来成果
* @param array
* @param num1
* @param num2
*/
public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
if (array == null || array.length < 3) {
return;
}
int re十五年等候留鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制作染料和布疋sult = array[0];
for (int i = 1; i < array.length; i++) {
result ^= array[i];
}
//找到第一个为1的位
int indexOfFirstBit1 = 0;
int temp = result;
while (temp != 0) {
indexOfFirstBit1++;
temp >>>= 1;
}
int mask = 1;
for (int i = 1; i < indexOfFirstBit1; i++) {
mask <<= 1;
}
//将第一位为1的位是否为1作为分组条件,分组异或
int n1 = -1, n2 = -1;
for (int i : array) {
if ((i & mask) == mask) {
if (n1 == -1) n1 = i; else n1 ^= i;
} else {
if (n2 == -1) n2 = i; else n2 ^= i;
}
}
num1[0] = n1;
num2[0] = n2;
}

第十题:和为S的两个数字

全pk10三军免费计划输入一个递加排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,假如有多对数字的和等于S,输出两个数的乘积最小的。

对应每个测验事例,输出两个数,小的先输出。

解题思路

  1. 运用二分查找的思维,由于是排序数组,经过两个指针来进行遍历
public ArrayList FindNumbersWithSum(int[] array, int sum) {
ArrayList res = new ArrayList<>();
if (array == null || array.length == 1) {
return res;
}
int start = 0, end = array.length - 1;
int minMulti = Integer.MAX_VALUE;
int a = -1, b = -1;
while (start < end) {
int t = array[start] + array[end];
if (t == sum) {
int multi = array[start] * array[end];
if (multi < minMulti) {
a = a央视二套骏丰频谱屋rray[start];
b = ar炉石烤蛇宴ray[end];
minMulti = multi;
}
start++;
end--;
} else if (t > sum) end--; else start++;
}
if (a == -1 || b == -1) {
return res;
}
res.add(a);
res.add(b);
return res;
}

第十一题:和为S的接连正数序列

输出一切和为S的接连正数序列。序列内依照从小至大的次序,序列间依照开端数字从小到大的舒嫔坐胎药次序

解题思路

  1. 与上一个标题相似,需求确认的是序列的最大值,不超越 sum
  2. 运用窗口陈杰少将形式,两个指针界说一个窗口,和为 t
public ArrayList> FindContinuousSequence(int sum) {
ArrayList> res = new ArrayList<>();
if (sum == 1) {
return res;
}
int start = 1, end = 2;
int t = start + end;
while (start < end) {
if (t == sum) {
ArrayList ints = new ArrayList<>();
for (int i = start; i <= end; i++) {
ints.add(i);
}
res.add(ints);
t -= start;
start++;
} else if (t > sum) {
t -= start;
start++;
} else {
if (end >= sum) break;
end++;
t += end;
}
}
return res;
}

第十二题:翻转单词次序列

全pk10三军免费计划牛客最近来了一个新员工 Fish ,每天早晨总是会拿着一本英文杂志,写些语句在簿本上。搭档Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不明白它的意思。例如,“student. a am I”。后来才意识到,这家伙本来把语句单词的次序翻转了,正确的语句应该是“I am a student.”。Cat对逐个的翻转这些单词次序可不内行,你能协助他么?

解题思路

public String ReverseSentence(String str) {
if(str == null || str.trim().equals("")) return str;
String[] split = str.split(" ");
StringBuilder builder = new StringBuilder();
for (int i = split.length - 1; i >= 0; i--) {
builder.append(split[i]);
if (i != 0) builder.append(" ");
}
return builder.toString();
}

第十三题:左旋转字符串

全pk10三军免费计划汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简略的使命,便是用字符串模仿这个指令的运算成果。关于一个给定的字符序列S云霄漳江论坛,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的成果,即“XYZdefabc”。是不是很简略?OK,搞定它!

解题思路

  1. 关于 abcXYZdef 左移 3位,能够将字符串分为两个部分:abc & XYZdef
  2. 别离将两个部分进行回转得到:cba & fedZYX
  3. 将两部分和在一同再进行回转:XYZdefabc
public String LeftRotateString(String str, int n) 十五年等候留鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制作染料和布疋十五年等候留鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制作染料和布疋{
if (str == null || str.trim().equals("")) return str;
String res = revert(str, 0, n - 1);
res = revert(res, n, str.length() - 1);
res = revert(res, 0, str.length() - 1);
return res;
}
private String rever中元穴t(String str, int start, int end) {
char[] chars = str.toCharArray();
while (start < end) {
char t = chars[start];
chars[start] = chars[end];
chars[end] = t;
start++;
end--;
}
return new String(chars);
}

第十四题:n个骰子的点数

把 n 个骰子扔在地上,一切骰子朝上一面的和为 s康立美,输入 n,打印 s 一切或许值的概率

解题思路

  1. 首要考虑一个骰子的状况,那么有 1~6 呈现的次数均为 1
  2. 再添加一个骰子时,由于各个点数呈现的概率共同。用$$f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6)$$
  3. 运用两个数组循环求解
public void SumOfNDice(int n) {
if (n < 1) {
return;
}
int[][] nums = new int[2][n * 6 + 1];
int flag = 0;
//初始化第一个骰子各总和呈现的次数
int maxLen = nums[0].length;
for (int i = 1; i < maxLen; i++) {
nums[flag][i] = 1;
}
for (int i = 2; i <= n; i++) {
int newFlag = flag ^ 0x01;
Arrays.fill(nums[newFlag], 0);
for (int j = i; j < maxLen; j++) {
int sum = 0;
for (int k = 1; k <= 6 && (j - k >= 0); k++) {
sum += nums[flag][j - k];
}
nums[newFlag][j] = sum;
}
flag = newFlag;
}
//debug out
System.out.println(Arrays.toString(nums[flag]));
int sum = 0;
for (int i : nums[flag]) {
sum += i;
}
for (int i = 0;忌独笑 i < nums[flag].length; i++) {
Syst查太莱夫人的情人em.out.println(i + ":" + nums[flag][i] * 1.0 / sum);
}
}

第十五题:扑克牌顺子

LL今日心境特别好,由于他去买了一副扑克牌,发现里边居然有 2 个大王,冯国辉 2 个小王(一副牌原本是 54 张)…他随机从中抽出了 5 张牌,想测测自己的手气,看看能不能抽到顺子,假如抽到的话,他决议去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决议大\小 王能够当作任何数字,而且A看作1,J为11,Q为12,K为13。上面的5张牌就能够变成“1,2,3,4,5”(大小王别离看作2和4),“So 十五年等候留鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制作染料和布疋Lucky!”。LL决议去买体育彩票啦。 现在,要求你运用这幅牌模仿上面的进程,然后告知咱们 LL 的命运怎么, 假如牌能组成顺子就输出 true,不然就输出 false。为了便利起见,你能够以为大小王是0。

解题思路

  1. 对数组进行排序
  2. 核算非0元素之间的距离总和
  3. 假如有十五年等候留鸟电视剧,华山论剑,凤凰游戏-彩条布染坊,专业制作染料和布疋相同元素则直接以为失利
  4. 假如距离大于0,那么距离的总个数等于0的总个数,即为成功
public Boolean崔铁飞 isContinuous(int[] numbers) {
if (numbers == null || numbers.length < 5) return false;
Arrays.sort(numbers);
int count = 0;
int zeroCount = 0;
int pre = -1;
for (int number : numbers) {
if (number == 0) {
zeroCount++;
continue;
}
if (pre == -1) pre = number; else {
int t = number - pre - 1;
if (t > 0) {
count += t;
} else if (t < 0) return false;
pre = number;
}
}
if (count == 0) return true; else return count == zeroCount;
}

写在最终

文章限于篇幅,还有许多面试题,我就不在这里逐个解说,面试题我现已整理成一份完好的PDF文件,需求的朋友,能够在转发后私信我【学习】,即可免费收取

以下是部分整理好的Java学习材料截图

金秋十月,祝我们面试马到功成,offer拿到手软!

文章版权及转载声明:

作者:admin本文地址:http://juinness.com/articles/4537.html发布于 2天前 ( 11-23 22:37 )
文章转载或复制请以超链接形式并注明出处彩条布染坊,专业制造染料和布匹