2023 阿里淘天笔试题 阿里笔试 0824
笔试时间:2023年8月24日 秋招
第一题
题目
小红有一个01字符串,她可以进行最多k次提作,每次操作交换相邻的两个字符,问可以得到的字典序最小的字符串是什么
输入描述
一行两个整数n和k,n,k表示字符串的长度和可以进行的操作次数接下来一行一个长度为n的01字符串。1<n<105; 1<k<109
输出描述
输出一个长度为n的字符串,表示字典序最小的字符串。
样例输入
5 2
01010
样例输出
00101
参考题解
双指针模拟,将第一个出现在1后面的0与最前面的1交换,若需要交换次数大于k,则后移指向1的指针,满足交换次数小
C++:
#include <iostream> #include <vector> #include <algorithm> using namespace std; void swapChars(char& a, char& b) { char temp = a; a = b; b = temp; } vector<int> findNextPos(const string& input, int indexOne, int indexZero) { for (int i = indexOne; i < input.length(); i++) { if (input[i] == '1') { indexOne = i; break; } } for (int i = indexZero; i < input.length(); i++) { if (input[i] == '0') { indexZero = i; break; } } return {indexOne, indexZero}; } int main() { int n, k; cin >> n >> k; string input; cin >> input; int indexOne = -1, indexZero = -1; for (int i = 0; i < input.length(); i++) { if (input[i] == '1') { indexOne = i; break; } } for (int i = input.length() - 1; i >= indexOne; i--) { if (input[i] == '0') { indexZero = i; } } if (indexZero == -1 || indexOne == -1) { cout << input << endl; return 0; } while (k > 0) { if (indexZero - indexOne <= k) { k -= (indexZero - indexOne); for (int i = indexOne; i <= indexZero; i++) { if (input[i] == '0') { swapChars(input[i], input[indexZero]); indexZero--; } } } else { while (indexZero - indexOne > k) { while (input[indexOne] != '1') { indexOne++; } } indexOne++; for (int i = indexOne; i <= indexZero; i++) { if (input[i] == '0') { swapChars(input[i], input[indexZero]); indexZero--; } } k -= (indexZero - indexOne); } vector<int> nextPos = findNextPos(input, indexOne, indexZero); indexOne = nextPos[0]; indexZero = nextPos[1]; } cout << input << endl; return 0; }
Java:
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt();; int k = sc.nextInt(); sc.nextLine(); char[] input= sc.nextLine().toCharArray(); int indexOne = -1, indexZero = -1; for (int i = 0; i < input.length; i++) { if(input[i] == '1'){ indexOne = i; break; } } for (int i = input.length - 1; i >= indexOne ; i--) { if(input[i] == '0'){ indexZero = i; } } if(indexZero == -1 || indexOne == -1){ print(input); return; } while(k > 0){ if(indexZero - indexOne <= k) { k -= (indexZero - indexOne); swap(input, indexOne, indexZero); }else{ while(indexZero - indexOne > k){ while(input[indexOne] != '1') indexOne++; } indexOne++; swap(input, indexOne, indexZero); k -= (indexZero - indexOne); } int[] next = nextPos(input, indexOne, indexZero); indexOne = next[0]; indexZero = next[1]; } print(input); } public static void print(char[] input){ for (char c : input) { System.out.print(c); } } public static void swap(char[] input, int i, int j){ char temp = input[i]; input[i] = input[j]; input[j] = temp; } public static int[] nextPos(char[] input, int indexOne, int indexZero){ for(int i = indexOne; i < input.length; i++){ if(input[i] == '1'){ indexOne = i; break; } } for (int i = indexZero; i < input.length; i++) { if(input[i] == '0'){ indexZero = i; break; } } return new int[]{indexOne, indexZero}; } }
Python:
def swap_chars(arr, i, j): arr[i], arr[j] = arr[j], arr[i] def find_next_pos(input_str, index_one, index_zero): for i in range(index_one, len(input_str)): if input_str[i] == '1': index_one = i break for i in range(index_zero, len(input_str)): if input_str[i] == '0': index_ze
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023 秋招笔试题汇总解析 文章被收录于专栏
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。