小米现场笔试题

本文详细解析了参加小米公司编程笔试时遇到的三道编程题,包括序列转换、图像填充操作和最小反回文串的求解方法。通过提供代码示例,帮助读者理解解题思路并提高编程能力。

前两天去小米的宣讲会参加了现场笔试,只有三道编程题,不算难,但在短时间内准确做对感觉还是不太容易的,笔试的时候就不小心出了一些小错误。老惯例,把题目再做一遍记下来,不足之处欢迎指正。


1. 求序列{A, B, C, ... , Z, AA, AB, AC, ... , AZ, BA, BB, ... , AAA, AAB, ...} 的第N项。

思路:此题考核的是将十进制数N转化成二十六进制表示,需要注意的是,此二十六进制表示法不含零元。

代码:

void test1(int n)
{
    string s = "";
    while(n > 0)
    {
        s = (char)('A' + (n - 1) % 26) + s;
        n = (n - 1) / 26;
    }
    cout << s << endl;
}


2. 对图像进行填充操作:

    用二维数组表示图,不同数字代表不同的颜色,编写函数fillWithColor(int x, int y, Color c),对图像进行颜色填充操作,即将(x, y)位置及预期相连的同色区域的颜色改为c,其中x为行,y为列。

class image{

Color getPixel(int x, int y);

void setPixel(int x, int y, Color c);

int getWidth();

int getHeight();

}

示例:

原图像:

0 1 2 1

2 1 3 2

1 1 4 1

0 1 1 2

执行fillWithColor(2, 2, 5),进行颜色填充后:

0 5 2 1

2 5 3 2

5 5 4 1

0 5 5 2


思路:递归,类似迷宫寻路问题和扫雷中的无雷区域问题。

代码:

<span style="font-size:18px;">void fillWithColor(int x, int y, Color c)
{
	Color old_c = getPixel(x, y);
	if(old_c == c) return;
	setPixel(x, y, c);
	if(x > 0 && getPixel() == old_c) fillWithColor(x-1, y, c);
	if(x < getHeight && getPixel() == old_c) fillWithColor(x+1, y, c);
	if(y > 0 && getPixel() == old_c) fillWithColor(x, y-1, c);
	if(y < getWidth() && getPixel() == old_c) fillWithColor(x, y+1, c);
	return;
}</span>


3. 求最小反回文串。

对于字符串s,若任意下标i的字符都与n-1-i下标的字符不一样,则成为反回文串。

输入一个字符串,求其字典顺序的最小反回文串。

思路:

1)先将字符串按字典序升序重排,得到最小字符串;

2)若重排后为反回文串,即为所求,否则回文现象必定出现在字符串的中心位置两侧;

3)设中心位置的字符为k,且对称轴左边有m个k,右边有n个k,则将其右边的n个k右移m个单位,所得字符串即为所求(注意:并非所有字符串都能求出反回文串,其充要条件是字符串中任意字符的数量都不超过字符串长度的一半)。


代码:

package xiaomiTest3;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static String rearrange(String s){
		char [] arr = s.toCharArray();
		Arrays.sort(arr);
		int length = arr.length;
		char mid = arr[length / 2];	//中间轴位置(长为奇数),或中间轴右侧第一位(长为偶数)
		int l = 1, r = 1, start = 0;
		if(length % 2 == 0){
			if(arr[length / 2 - 1] != mid) return new String(arr);
			start = length / 2;
			for(int i = length / 2 - 2; i >= 0 && arr[i] == mid; i--) l++;
			for(int i = length / 2 + 1; i < length && arr[i] == mid; i++) r++;
			if(l + r > length / 2) return null;
		}
			
		if(length % 2 == 1){
			if(arr[length / 2 - 1] != arr[length / 2 + 1]) return new String(arr);
			start = length / 2 + 1;
			for(int i = length / 2 - 2; i >= 0 && arr[i] == mid; i--) l++;
			for(int i = length / 2 + 2; i < length && arr[i] == mid; i++) r++;
			if(l + r > length / 2) return null;
		}
		String s1 = new String(arr);
		//System.out.println(s1 + " " + start + " " + l + " " + r);
		return s1.substring(0, start) + s1.substring(start + r, start + r + l)
			+ s1.substring(start, start + r) + s1.substring(start + r + l);
	}
	
	public static void main(String [] args){
		Scanner sca = new Scanner(System.in);
		while(sca.hasNextLine()){
			System.out.println(rearrange(sca.nextLine()));
		}
	}

}



### 小米前端笔试题目及相关考核点 小米公司在招聘前端工程师时,通常会注重考察候选人对基础技术的理解以及实际应用能力。以下是可能涉及的知识点和具体方向: #### 1. **HTML/CSS/JavaScript基础知识** HTML、CSS 和 JavaScript 是前端开发的核心技能,也是笔中最常见的部分之一。可能会涉及到的内容包括但不限于: - DOM 操作与事件处理制[^2]。 - CSS 的布局方式(Flexbox, Grid),响应式设计原理及其实践方法。 - ES6+ 新特性如箭头函数、模板字符串、模块化导入导出等的实际运用场景。 #### 2. **性能优化** 性能问题是现代Web应用程序中不可忽视的一环,在考过程中也可能被提及到相关内容比如图片懒加载策略;减少HTTP请求次数的技术手段等等[^4]。 #### 3. **框架相关问题** 随着Vue.js 或 React 成为主流前端库的选择之一,对于这些流行框架的工作原理及最佳实践中的一些细节理解同样重要。例如生命周期钩子的作用范围是什么? 如何通过虚拟DOM提高渲染效率? #### 4. **算法与数据结构** 虽然主要针对的是后端或者全栈角色,但是了解基本的数据结构 (数组、链表...) 及常见算法(排序、搜索..) 对于解决复杂业务逻辑仍然很有帮助 。因此不排除会在某些情况下遇到此类挑战性较大的题目类型 [^1]. #### 示例代码展示 下面给出一段简单的javascript闭包例子用于说明作用域概念: ```javascript function createCounter() { let count = 0; return function () { return ++count; }; } const counter = createCounter(); console.log(counter()); // 输出: 1 console.log(counter()); // 输出: 2 ``` ### 结论 综上所述,准备参加小米前端岗位笔的同学应该全面复习上述提到的各项要点,并多做练习以增强实战经验。同时也要关注最新的行业趋势和技术发展动态以便更好地适应未来工作中可能出现的新需求变化情况 [^3].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值