看看你可以ACM入门吗
前言
昨天参加了一下校内ACM队选拔。第一次以考试竞赛做算法,紧张到连个数组定义都快忘了,读个题还读了几遍才反应过来。考完反省良多。顺便考后总结了一下题目,其实整体还是算蛮简单的,都是LeetCode上的入门题,也是一些基础题
本篇博客主要是基于在去ACM选拔前做心理准备时,发现搜不到判断自己算法水平题时写的,只做参考
1. 一维数组的动态和
给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。
示例 1:
输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。
示例 2:
输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
示例 3:
输入:nums = [3,1,2,10,1]
输出:[3,4,6,16,17]
提示:
1 <= nums.length <= 1000
-10^6 <= nums[i] <= 10^6
/**
* 第一题:一维数组的动态和
*/
public static int[] runningSum(int[] nums) {
//请在此补充代码
int i,j,temp=0;
int[] rtnums=new int[nums.length];
for(i=0;i<nums.length;i++){
for(j=0;j<=i;j++){
temp=temp+nums[j];
}
rtnums[i]=temp;
temp=0;
}
return rtnums;
}
2. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
限制:
1 <= k < s.length <= 10000
/**
* 第二题:左旋转字符串
*/
public static String reverseLeftWords(String s, int n) {
//请在此补充代码
if (s == null || n < 0 || n > s.length()) return "";
char[] chars = s.toCharArray();
int length = chars.length;
String reverse = "";
for(int i =n;i<length;i++){
reverse += chars[i];
}
String reverse2 = "";
for(int k=0;k<n;k++){
reverse2 +=chars[k];
}
String reverse3 = reverse + reverse2;
return reverse3;
}
// C语言-可以不看
//char* reverseLeftWords(char* s, int n){
// int i = 0;
// int sz = strlen(s);
// for (i = 0; i < sz / 2; i++){
// char ret = *(s + i);
// *(s + i) = *(s + sz - 1 - i);
// *(s + sz - 1 - i) = ret;
// }
// for (i = 0; i < (sz - n) / 2; i++){
// char ret = *(s + i);
// *(s + i) = *(s + sz - 1 - n - i);
// *(s + sz - 1 - n - i) = ret;
// }
// for (i = 0; i < n / 2; i++){
// char ret = *(s + sz - n + i);
// *(s + sz - n + i) = *(s + sz - 1 - i);
// *(s + sz - 1 - i) = ret;
// }
// return s;
// }
// int main(){
// char s[] = "lrloseumgh";
// int n = 0;
// scanf("%d", &n);
// reverseLeftWords(s,n);
// printf("%s\n", s);
// return 0;
// }
也可参考:有其他写法与思路
链接: https://blog.csdn.net/lsy_666/article/details/104840144.
咪咻咪咻皮卡丘 2020-03-13 15:17:25
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
3.存在重复3次的元素
给定一个整数数组,判断是否存在重复3次元素。
如果任意一值在数组中出现至少3次,函数返回 true 。如果数组中每个元素都不相同或者存在两次相同,则返回 false 。
示例 1:
输入: [1,2,3,1]
输出: false
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
/**
* 第三题:存在重复3次的元素
*/
public static boolean containsDuplicate(int[] nums) {
//请在此补充代码
Arrays.sort(nums);
int len = nums.length;
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(nums[i]==nums[j]) {
for(int k=j+1;k<len+1;k++) {
if(nums[j]==nums[k])return true;
else return false;
}
}
else return false;
}
return false;
}
return false;
}
4.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
*//其实就是倒数第一和正数第一交换位置,倒数第二和正数第二交换位置,直到下标相等时候不交换*
/**
* 第四题:反转字符串
*/
public static char[] reverseString(char[] s) {
//请在此补充代码
int begin =0;
int end =s.length-1;
while(begin<end){
char temp = s[begin];
s[begin] = s[end];
s[end] = temp;
begin++;
end--;
}
return s;
}
以下是完整测验代码
package 算法;
import java.util.Arrays;
/**
* 请在此注释你的 姓名,班级,专业
* 例如:
*/
public class Solution {
public static void main(String[] args) {
//请在此测试你写的方法
//测试第一题
//test1();
//测试第二题
test2();
//测试第三题
//test3();
//测试第四题
//test4();
}
/**
* 第一题:一维数组的动态和
*/
public static int[] runningSum(int[] nums) {
//请在此补充代码
//请删除下面一行代码
int i,j,temp=0;
int[] rtnums=new int[nums.length];
for(i=0;i<nums.length;i++){
for(j=0;j<=i;j++){
temp=temp+nums[j];
}
rtnums[i]=temp;
temp=0;
}
return rtnums;
}
/**
* 第二题:左旋转字符串
*/
public static String reverseLeftWords(String s, int n) {
//请在此补充代码
//请删除下面一行代码
if (s == null || n < 0 || n > s.length()) return "";
char[] chars = s.toCharArray();
int length = chars.length;
String reverse = "";
for(int i =n;i<length;i++){
reverse += chars[i];
}
String reverse2 = "";
for(int k=0;k<n;k++){
reverse2 +=chars[k];
}
String reverse3 = reverse + reverse2;
return reverse3;
}
/**
* 第三题:存在重复3次的元素
*/
public static boolean containsDuplicate(int[] nums) {
//请在此补充代码
//请删除下面一行代码
Arrays.sort(nums);
int len = nums.length;
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(nums[i]==nums[j]) {
for(int k=j+1;k<len+1;k++) {
if(nums[j]==nums[k])return true;
else return false;
}
}
else return false;
}
return false;
}
return false;
}
/**
* 第四题:反转字符串
*/
public static char[] reverseString(char[] s) {
//请在此补充代码
//请删除下面一行代码
int begin =0;
int end =s.length-1;
while(begin<end){
char temp = s[begin];
s[begin] = s[end];
s[end] = temp;
begin++;
end--;
}
return s;
}
//以下的代码为测试代码,不用阅读,可以忽略
//以下的代码为测试代码,不用阅读,可以忽略
//以下的代码为测试代码,不用阅读,可以忽略
public static void test1() {
int[] nums = {1, 2, 3, 4};
int[] result = runningSum(nums);
System.out.println("你的第一题的输入为:[1, 2, 3, 4]");
System.out.print("你的第一题输出为:");
printIntElements(result);
}
public static void test2() {
//第二题
String s = "abcdefg";
int k = 2;
System.out.println("你的第二题输入为:s = \"abcdefg\", k = 2");
System.out.println("你的第二题输出为:" + reverseLeftWords(s, k));
}
public static void test3() {
int[] array1 = {1, 1, 1, 3, 3, 4, 3, 2, 4, 2};
int[] array2 = {1, 2, 3, 1};
System.out.println("你的第三题输入1为:[1, 1, 1, 3, 3, 4, 3, 2, 4, 2]");
System.out.println("你的第三题输出1为:" + containsDuplicate(array1));
System.out.println("你的第三题输入2为:[1, 2, 3, 1]");
System.out.println("你的第三题输出2为:" + containsDuplicate(array2));
}
public static void test4() {
char[] charArray = {'h', 'e', 'l', 'l', 'o'};
System.out.println("你的第四题输入为:");
printElements(charArray);
char[] reverseResult = reverseString(charArray);
System.out.println("你的第四题输出为:");
printElements(reverseResult);
}
public static void printElements(char[] charArray) {
System.out.print("[");
for (int i = 0; i < charArray.length; i++) {
if (i == charArray.length - 1) {
System.out.print(charArray[i]);
} else {
System.out.print(charArray[i] + ",");
}
}
System.out.print("]");
System.out.println();
}
public static void printIntElements(int[] charArray) {
System.out.print("[");
for (int i = 0; i < charArray.length; i++) {
if (i == charArray.length - 1) {
System.out.print(charArray[i]);
} else {
System.out.print(charArray[i] + ",");
}
}
System.out.print("]");
System.out.println();
}
}
总结
提示:如果看完,你觉得可以很快写出,那你可以去刷算法题了,进行下一步进阶了。如果有点蒙,那么搞搞基础先吧,你还不适合。