恭喜发现宝藏!微信搜索公众号【TechGuide】关注更多新鲜好文和互联网大厂的笔经面经。
作者@TechGuide【全网同名】
点赞再看,养成习惯,您动动手指对原创作者意义非凡🤝
文章目录
第一道:两数之和(100%)
题目描述
找和为m的两个数的对数
思路解析
直接暴力(可以二分优化)
参考代码:
Java版本
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class TechGuide{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
List<Integer> list = new ArrayList<>();
while (in.hasNextInt()) {
list.add(in.nextInt());
}
int m = list.get(list.size() - 1);
int n = list.size() - 1;
int cnt = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (list.get(i) + list.get(j) <= m) {
cnt++;
}
}
}
System.out.println(cnt);
}
}
// 关注TechGuide! 大厂笔经面经闪电速递!
CPP版本
#include <bits/stdc++.h>
using namespace std;
int num[100005];
int n;
int main()
{
n = 0;
int tmp;
while(scanf("%d",&tmp)!=EOF){
num[++n] = tmp;
}
int ans = 0;
sort(num+1,num+n);
for(int i=1;i<n;i++){
for(int j=i+1;j<n;j++){
if(num[i]+num[j]<=num[n])
ans++;
else
break;
}
}
printf("%d\n",ans);
return 0;
}
第二道: reverse invert(100%)第二题 leetcode1545
题目描述
返回生成字符串的第k位字符,由给的n确定对字符的递归的规律,可以看模拟代码看规律。
思路解析
java直接模拟,返回Sn的第k位字符, k 表示需要返回的字符下标位。
cpp找到了规律,将字符串分为三段,然后递归着去找相对应的字符,只有最后一段需要处理下。
参考代码
import java.util.Collections;
public class TechGuide{
public char findKthBit (int n, int k) {
String s = getString(n);
return s.charAt(k - 1);
}
private String getString(int n) {
if (n == 1) {
return "a";
}
String pre = getString(n - 1);
return pre + (char) ('a' + n - 1) + reverse(invert(pre));
}
private String reverse(String s) {
char[] chs = s.toCharArray();
int left = 0, right = chs.length - 1;
while (left <= right) {
char tmp = chs[left];
chs[left] = chs[right];
chs[right] = tmp;
left++;
right--;
}
return String.valueOf(chs);
}
private String invert(String s) {
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++) {
int n = chs[i] - 'a';
n = 26 - n;
chs[i] = (char) ('a' + n - 1);
}
return String.valueOf(chs);
}
}
// 关注TechGuide! 大厂笔经面经闪电速递!
CPP版本
class Solution {
public:
char findKthBit(int n, int k) {
int cnt = 1<<(n-1);
if(k<cnt)
return findKthBit(n-1, k);
if(k==cnt)
return 'a'+n-1;
//大于n
k = k-cnt;
return 'a'+'z'-findKthBit(n-1, (1<<(n-1))-k);
}
};
第三道:分发纸张
题目描述
给围成一圈的小朋友分发纸张,可以参考力扣【分发糖果】
思路解析
题目说的是小朋友"围成一圈", 所以要考虑成环的情况.。
Java用的贪心思想,cpp 只是多加了 num[n] 和 num[1] 的大小比较就过了。
参考代码
Java版本
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class TechGuide{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> ages = new ArrayList<>();
while (sc.hasNextInt()) {
ages.add(sc.nextInt());
}
int[] papers = new int[ages.size()];
Arrays.fill(papers, 1);
int n = papers.length;
if (n == 1) {
System.out.println(1);
return;
}
for (int i = 0; i < n; i++) {
if (i == 0) {
if (ages.get(i) > ages.get(n - 1)) {
papers[i] = Math.max(papers[n - 1] + 1, papers[i]);
}
if (ages.get(i) > ages.get(i + 1)) {
papers[i] = Math.max(papers[i + 1] + 1, papers[i]);
}
} else if (i == n - 1) {
if (ages.get(i) > ages.get(0)) {
papers[i] = Math.max(papers[0] + 1, papers[i]);
}
if (ages.get(i) > ages.get(i - 1)) {
papers[i] = Math.max(papers[i - 1] + 1, papers[i]);
}
} else {
if (ages.get(i) > ages.get(i + 1)) {
papers[i] = Math.max(papers[i + 1] + 1, papers[i]);
}
if (ages.get(i) > ages.get(i - 1)) {
papers[i] = Math.max(papers[i - 1] + 1, papers[i]);
}
}
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += papers[i];
}
System.out.println(sum);
}
}
// 关注TechGuide! 大厂笔经面经闪电速递!
CPP版本
#include <bits/stdc++.h>
using namespace std;
int n;
int num[1005];
int val[1005];
int main()
{
n = 0;
int tmp;
while(scanf("%d",&tmp)!=EOF)
{
num[++n] = tmp;
}
val[1] = 1;
for(int i=2; i<=n; i++)
{
if(num[i]>num[i-1])
val[i] = val[i-1] + 1;
else
val[i] = 1;
}
for(int i=n-1; i>=1; i--)
{
if(num[i]>num[i+1])
{
val[i] = max(val[i],val[i+1]+1);
}
}
//只多加了这一行
if(num[n]>num[1])
val[n] = max(val[n],val[1]+1);
int ans = 0;
for(int i=1; i<=n; i++)
ans = ans + val[i];
printf("%d\n",ans);
return 0;
}
第四道:最小航行费用
题目描述
计算从矩形网络的起始到目标的最低费用(求最短路径)
输入:
{1, 1, 1, 1, 0},
{0, 1, 0, 1, 0},
{1, 1, 2, 1, 1},
{0, 2, 0, 0, 1}
思路解析
动态规划
参考代码
Java版本
import java.util.Arrays;
public class TechGuide{
public int minSailCost (int[][] input) {
if (input == null || input.length == 0 || input[0].length == 0) {
return -1;
}
if (input[0][0] == 2) {
input[0][0] = 1; // 更改起点
}
int m = input.length, n = input[0].length;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (input[i][j] == 1) {
dp[i][j] = 1;
} else if (input[i][j] == 0) {
dp[i][j] = 2;
} else if (input[i][j] == 2) {
dp[i][j] = -1;
continue;
}
if (i == 0 && j == 0) {
continue;
}
int min = -1;
if (i - 1 >= 0) {
if (dp[i - 1][j] != -1) {
min = dp[i - 1][j];
}
}
if (j - 1 >= 0) {
if (dp[i][j - 1] != -1) {
min = min == -1 ? dp[i][j - 1] : Math.min(min, dp[i][j - 1]);
}
}
dp[i][j] = min == -1 ? -1 : min + dp[i][j];
}
}
if (dp[m - 1][n - 1] == -1) {
return -1;
} else {
return dp[m - 1][n - 1] - dp[0][0];
}
}
}
// 关注TechGuide! 大厂笔经面经闪电速递!
CPP版本
int minSailCost(vector<vector<int>>& input) {
int m = input.size(), n = input[0].size();
vector<vector<long>> dp(m, vector<long>(n,0L));
dp[0][0] = 0;
for (int i = 1; i<m; ++i)
{
if (input[i][0] == 2 || dp[i - 1][0] >=INT_MAX) dp[i][0] = INT_MAX;
else if (input[i][0] == 1) dp[i][0] = dp[i - 1][0] + 1;
else dp[i][0] = dp[i - 1][0] + 2;
}
for (int j = 1; j<n; ++j)
{
if (input[0][j] == 2 || dp[0][j] >= INT_MAX) dp[0][j] = INT_MAX;
else if (input[0][j] == 1) dp[0][j] = dp[0][j - 1] + 1;
else dp[0][j] = dp[0][j - 1] + 2;
}
for (int i = 1; i<m; ++i)
{
for (int j = 1; j<n; ++j)
{
int val;
if (input[i][j] == 2 || (dp[i - 1][j] >= INT_MAX && dp[i][j - 1] >= INT_MAX)) dp[i][j] = INT_MAX;
else if (input[i][j] == 1) dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
else dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 2;
}
}
return dp[m - 1][n - 1] >= INT_MAX ? -1 : dp[m - 1][n - 1];
}
// 关注TechGuide! 大厂笔经面经闪电速递!
恭喜发现宝藏!微信搜索公众号【TechGuide】关注更多新鲜好文和互联网大厂的笔经面经。