题目1 字符串替换
字符串替换,给定一个字符串,以及一个keys数组和values数组,keys数组和values数组相对应,在给定的字符串中,如果%中间的子串存在于keys中,则将%子串%替换为keys对应的values。
输入:
"%FILENAME%VIRUSNAME%SENDER%VIRUSNAME%FILENAME%",
["SENDER"
,
"RCPTS"
,
"SUBJECT"
,
"FILENAME"
,
"VIRUSNAME"
,
"ACTION"],
["abc@test.com"
,
"test@company.com"
,
"Test"
,
"Myfile"
,
"ICAN"
,"Delete"]
输出:
"MyfileVIRUSNAME%balabalabalaICANFILENAME%"
思路:
使用Map记录keys和values的关系,然后使用双指针,遍历给定的字符串即可,注意细节处理!这道题当时卡在细节处理了,难倒英雄汉。。。。
代码:
#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
string get(string my_template, vector<string>&keys,vector<string>&values){
int n = my_template.size();
map<string,string> mp;
for(int i=0;i<keys.size();i++){
mp[keys[i]] = values[i];
}
string ans = "";
int pre = 0;
int len = 0;
for(int i=1;i<n;i++){
if (my_template[i]=='%'){
if(my_template[pre] == '%'){
len = i-pre-1;
string tmp = my_template.substr(pre+1,len);
if(mp.count(tmp)){
ans+=mp[tmp];
pre = i+1;
continue;
}
len = i - pre;
ans+=my_template.substr(pre,len);
pre = i;
}else{
len = i - pre;
string tmp = my_template.substr(pre,len);
ans+=tmp;
pre = i;
}
}
}
ans+=my_template[pre];
return ans;
}
};
int main(){
Solution s ;
vector<string> keys;
vector<string> values;
string my_template = "%FILENAME%VIRUSNAME%SENDER%VIRUSNAME%FILENAME%";
keys.push_back("SENDER");
keys.push_back("RCOTS");
keys.push_back("SUBJECT");
keys.push_back("FILENAME");
keys.push_back("VIRUSNAME");
keys.push_back("ACTION");
values.push_back("abc@test.com");
values.push_back("test@company.com");
values.push_back("Test");
values.push_back("Myfile");
values.push_back("ICAN");
values.push_back("Delete");
string ans = s.get(my_template,keys,values);
cout<<ans<<endl;
return 0;
}
Java代码:
public class 趋势科技1 {
/*
字符串替换
*/
public static void main(String[] args) {
String my_template = "%FILENAME%VIRUSNAME%balabalabala%VIRUSNAME%FILENAME%";
String[] keys = new String[]{"SENDER","RCPTS","SUBJECT","FILENAME","VIRUSNAME","ACTION"};
String[] values = new String[]{"abc@test.com","test@company.com","Test","Myfile","ICAN","Delete"};
StringBuilder sb = new StringBuilder();
int len = my_template.length();
for(int i=0;i<len;i++){
if(my_template.charAt(i)=='%'){
boolean flag = false;
for(int j=0;j<keys.length;j++){
int size = keys[j].length();
if(size+i+1<len
&&my_template.substring(i+1,size+i+1).equals(keys[j])
&&my_template.charAt(i+size+1)=='%'){
sb.append(values[j]);
i=i+size+1;
flag=true;
break;
}
}
if(!flag)sb.append(my_template.charAt(i));
}else{
sb.append(my_template.charAt(i));
}
}
System.out.println(String.valueOf(sb));
}
}
题目2 岛屿中最长的曼哈顿距离
类似于leetcode 200中求岛屿的数量,以及岛屿中最大的曼哈顿距离;
思路:
暴力DFS+求解曼哈顿距离!
代码:
// Java版本
import java.util.ArrayList;
/*
岛屿问题中再加入最长曼哈顿距离
*/
public class 趋势科技2 {
static int max = Integer.MIN_VALUE;
public static void main(String[] args) {
int count = 0;
int[][] nums = new int[][]{
{0,0,0,0,0,1,1,1,1,1},
{0,1,0,0,0,1,0,0,0,1},
{0,0,0,0,0,1,0,0,0,1},
{0,0,0,0,0,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,1,1,1,0,0,0},
{0,0,0,1,1,1,1,1,0,0},
{1,1,1,1,1,1,1,1,1,0}
};
boolean[][] flag = new boolean[nums.length][nums[0].length];
for(int i=0;i< nums.length;i++){
for(int j=0;j<nums[0].length;j++){
if(nums[i][j]==1&&!flag[i][j]){
dfs(nums,i,j,new ArrayList<>(),flag);
count++;
}
}
}
System.out.println(count);
System.out.println(max);
}
public static void dfs(int[][] nums, int i, int j, ArrayList<int[]> list,boolean[][] flag){
//边界和判断条件
if(i<0||j<0||i>=nums.length||j>=nums[0].length||nums[i][j]==0||flag[i][j])return;
//这里因为要用到网格的1,所以不能设为0,添加了一个flag来做是否走过的判断
flag[i][j] = true;
//使用一个list<int[]> 存一个图形中所有的点,以此来算最大曼哈顿距离
for(int[] pre : list){
int temp = Math.abs(pre[0]-i)+Math.abs(pre[1]-j);
max = Math.max(temp,max);
}
//添加这次的点到list中
list.add(new int[]{i,j});
//遍历四周
dfs(nums,i+1,j,list,flag);
dfs(nums,i,j+1,list,flag);
dfs(nums,i-1,j,list,flag);
dfs(nums,i,j-1,list,flag);
}
}
C++版本:
#include<iostream>
#include<vector>
using namespace std;
int maxx = INT_MIN;
int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void dfs(vector<vector<int> > nums, int i,int j, vector<pair<int,int> > points, vector<vector<bool> > flag){
if(i<0||j<0||i>=nums.size()||j>=nums[0].size()||nums[i][j]==0||flag[i][j]){
return;
}
flag[i][j] = true;
for(int k=0;k<points.size();k++){
int x = points[k].first;
int y = points[k].second;
int dis = abs(x-i)+abs(y-j);
maxx = max(maxx,dis);
}
points.push_back(pair<int,int>(i,j));
for(int k=0;k<4;k++){
int dx = i+dir[k][0];
int dy = i+dir[k][1];
dfs(nums,dx,dy,points,flag);
}
return;
}
int main()
{
int count = 0;
vector<vector<int> > nums={...};
vector<vector<bool> > flag;
vector<pair<int,int> >list;
for(int i=0;i<nums.size();i++){
for(int j=0;j<nums[0].size();j++){
if(nums[i][j] == '1' && !flag[i][j]){
dfs(nums,i,j,list,flag);
count++;
}
}
}
cout<<count<<endl;
cout<<maxx<<endl;
return 0;
}
总结:
这一次是前期做的一个笔试,手比较生,继续加油吧!提高自己的做题速度!!!!!